ESP8266 Arduino Json object array десериализация в структуру
Я пытаюсь де сериализовать массив объектов 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
@Boyfinn, 👍1
1 ответ
Лучший ответ:
Для строк не выделяется память. Вы должны объявить свою структуру следующим образом:
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, он показывает все это.
- NodeMCU 1.0 автоматически сбрасывается через некоторое время
- Как назначить точке доступа ESP8266 имя хоста, которое может быть разрешено станциями?
- Рассчитать напряжение батареи (18650 Li-ion) с помощью ESP8266-12E
- esp32 Stack canary watchpoint срабатывает
- Ошибка при загрузке «Произошла фатальная ошибка esptool.py: тайм-аут записи»
- ESP32S v1.1 NodeMCU vs ESP32 DevKitV1
- NodeMCU (Arduino IDE) «DynamicJsonBuffer» не был объявлен в этой области
- esp32-cam публикует изображение в mqtt