ESP8266 Arduino Json object array десериализация в структуру

esp8266 json espressif esp

Я пытаюсь де сериализовать массив объектов JSON в структуру. Следуя инструкциям, данным помощником Arduino JSON, мне удалось создать эту вспомогательную функцию:

void JsonPreprocessor(const char* buf)
{
  StaticJsonDocument<96> filter;

  JsonObject filter_ResponseData_Metros_0 = filter["ResponseData"]["Metros"].createNestedObject();
  filter_ResponseData_Metros_0["Destination"] = true;
  filter_ResponseData_Metros_0["ExpectedDateTime"] = true;
  filter_ResponseData_Metros_0["Deviations"] = true;

  StaticJsonDocument<512> doc;

  DeserializationError error = deserializeJson(doc, buf, DeserializationOption::Filter(filter));

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

  JsonArray ResponseData_Metros = doc["ResponseData"]["Metros"];
  for (int i = 0; i < MAX_ELEMENTS; i++)
  {
    strcpy(dep_arr[i].destination, ResponseData_Metros[i]["Destination"]);
    strcpy(dep_arr[i].destination, ResponseData_Metros[i]["ExpectedDateTime"]);
  }
}

Функция записывает в массив структур, объявленных следующим образом:

struct Departure {
   char* destination;
   char* departure;
   int  deviation;
} depart; 

struct Departure dep_arr[MAX_ELEMENTS];

И JSON передается как постоянный массив символов в функцию препроцессора. Загрузка и запуск этой функции приводит к сбою моего ESP8266 без какого-либо отладочного вывода. Без публикации всего объекта json, который достаточно длинный, как и без фильтров, мой массив объектов в JSON выглядит примерно так после фильтрации:

{
  "ResponseData": {
    "Metros": [
      {
        "Destination": "Destination_1",
        "ExpectedDateTime": "2021-04-29T05:15:30",
        "Deviations": 1
      },
      {
        "Destination": "Destination_2",
        "ExpectedDateTime": "2021-04-29T05:21:30"
      },
      {
        "Destination": "Destination_2",
        "ExpectedDateTime": "2021-04-29T05:30:30"
      },
      {
        "Destination": "Destination_1",
        "ExpectedDateTime": "2021-04-29T05:36:30"
      },
      etc...
    ]
  }
}

В моем тестовом коде я определил макрос MAX_ELEMENTS как 3.

Я нахожусь в полной растерянности из-за отсутствия каких-либо отладочных результатов. Я использую ArduinoJson6, и мой код написан и скомпилирован на Arduino IDE 2.0.0-beta.5

, 👍1


1 ответ


Лучший ответ:

2

Для строк не выделяется память. Вы должны объявить свою структуру следующим образом:

struct Departure {
   char destination[32];
   char departure[32];
   int  deviation;
} depart; 

Это предполагает, что максимальная длина обеих строк составляет 31 символ.

Затем передайте максимальный размер strlcpy():

strlcpy(dep_arr[i].destination, ResponseData_Metros[i]["Destination"], 32);
strlcpy(dep_arr[i].destination, ResponseData_Metros[i]["ExpectedDateTime"], 32);

Если ваши строки очень длинные, вы можете использовать строку вместо char[].

Смотрите пример JsonConfigFile.ino, он показывает все это.

,