Распарсить json от сервера blynk-cloud.com

Тема в разделе "ESP8266, ESP32", создана пользователем mifar, 17 фев 2021.

  1. mifar

    mifar Нерд

    Добрый день!
    Сервер Blynk на запрос http://blynk-cloud.com/auth_token/get/pin выдает ответ в таком виде
    1.jpg

    2.jpg
    Если я правильно понимаю, то этот ответ в формате json? Но при попытке распарсить его с помощью библиотеки ArduinoJson.h ничего не получается. Или это какой то "неправильныей" пчелыjson? И проще обработать его как обычную строку?
     
  2. KindMan

    KindMan Гуру

    Поскольку вы не указали как пытаетесь распарсить, то скорее всего
    код.
     
  3. mifar

    mifar Нерд

    Код на основе примера из библиотеки
    Код (C++):
    #include <ArduinoJson.h>    //https://github.com/bblanchon/ArduinoJson
    #include <ESP8266WiFi.h>

    const char* ssid     = "ssid";         // тут SSID и пароль к WIFI
    const char* password = "pass";
    const char* host = "blynk-cloud.com";     // тут адрес сервера

    void getWeatherData() //client function to send/receive GET request data.
    {
      String result = "";
    WiFiClient client;
      const int httpPort = 80;
      if (!client.connect(host, httpPort)) {
        return;
      }
      // We now create a URI for the request
      String url = "/auth_token/get/V1";

      // This will send the request to the server
    client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                   "Host: " + host + "\r\n" +
                   "Connection: close\r\n\r\n");

     
      unsigned long timeout = millis();
      while (client.available() == 0) {
        if (millis() - timeout > 5000) {
          client.stop();
          return;
        }
      }

      // Read all the lines of the reply from server
      while (client.available()) {
        result = client.readStringUntil('\r');
      }
    Serial.print("result ");Serial.println(result);
      result.replace('[', ' ');
      result.replace(']', ' ');
      char jsonArray [result.length() + 1];
    result.toCharArray(jsonArray, sizeof(jsonArray));
    jsonArray[result.length() + 1] = '\0';

    Serial.print("jsonArray "); Serial.println(jsonArray);
    StaticJsonDocument<128> doc;

      DeserializationError error = deserializeJson(doc, jsonArray);

      if (error) {
        Serial.print("deserializeJson() failed: ");
        Serial.println(error.c_str());
        return;
      }

    // Extract values
    // ?????????????????????????????????????????????????????????
    Serial.println(doc[""].as<char*>());
    Serial.println(doc[""].as<long>());
    Serial.println(doc["0"][0].as<float>(), 6);
    //??????????????????????????????????????????????????????????????
    }

    void setup()
    {
      Serial.begin(9600);
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      Serial.println("WiFi connected");
       getWeatherData();
    }

    void loop() {

    }
    В сериал получаю
    result
    ["-3.500","986912"]
    jsonArray
    "-3.500","986912"

    0
    0.000000
    Вся загвоздка в секции // Extract values. В примере парсится json другого формата
    It performs a GET resquest on arduinojson.org/example.json
    // Here is the expected response:
    {
    "sensor": "gps",
    "time": 1351824120,
    "data": [
    48.756080,
    2.302038
    ]
    }

    // Extract values
    Serial.println(F("Response:"));
    Serial.println(doc["sensor"].as<char*>());
    Serial.println(doc["time"].as<long>());
    Serial.println(doc["data"][0].as<float>(), 6);
    Serial.println(doc["data"][1].as<float>(), 6);
    А вот как мне указать правильно поля и т.д. не могу понять
     
  4. b707

    b707 Гуру

    интересно. нафига вы квадратные скобки из массива удаляете?

    и добавлю, если
    ["-3.500","986912"]
    - это все что приходит в ответ. то это не ясон никакой. а какие-то обрывки.
    почему быв вам не распарсить его самостоятельно. без библиотеки
     
  5. mifar

    mifar Нерд

    Это было в одном из примеров в сети. Пробовал их оставить - результат тот же
     
  6. parovoZZ

    parovoZZ Гуру

    В своём уме?
     
  7. KindMan

    KindMan Гуру

    Так ясен пень, что это такое?
    Код (C++):
    Serial.println(doc[""].as<char*>());
    Serial.println(doc[""].as<long>());
    Serial.println(doc["0"][0].as<float>(), 6);
    Читайте просто по номеру в массиве
    Код (C++):
    #include <ArduinoJson.h>

    void setup() {
      Serial.begin(9600);
      StaticJsonDocument<128> doc;
     
      char jsonArray[] = "[\"-3.500\",\"986912\"]";

      Serial.print("jsonArray "); Serial.println(jsonArray);

      DeserializationError error = deserializeJson(doc, jsonArray);

      if (error) {
        Serial.print(F("deserializeJson() failed: "));
        Serial.println(error.c_str());
        return;
      }

     
      float one = doc[0];
      long two = doc[1];

      Serial.println(one);
      Serial.println(two);
    }

    void loop() {}
     
     
  8. mifar

    mifar Нерд

    Это по мотивам народного творчества примеров с arduinojson.org
    Спасибо, заработало!