ArduinoJSON :: Как определить размер массива в DOC, содержащем не только массивы
Файл параметров, содержащий темы MQTT, как показано ниже, считывается в StaticJsonDocument<1250> DOC
переменная.
Размер некоторых групп может различаться в зависимости от MCU, например, sub_topics_win
может содержать больше тем, если MCU состоит из 8 ретрансляторов. Для этого мне нужна гибкость, чтобы читать определенную тему, которая может отличаться по размеру.
Как это сделать правильно?
{
"pub_gen_topics": [
"myHome/Messages",
"myHome/log",
"myHome/debug"
],
"pub_topics": [
"myHome/Cont_A/Avail",
"myHome/Cont_A/State"
],
"sub_topics": [
"myHome/Cont_A",
"myHome/All",
"myHome/lockdown"
],
"sub_topics_win": [
"myHome/Windows/gFloor/TwinWindow",
"myHome/Windows/gFloor/Pergola"
],
"sub_topics_SW": [
"myHome/Light/int/gFloor/SalAmbient1",
"myHome/Light/int/gFloor/SalAmbient2",
"myHome/Light/int/gFloor/Lobby",
"myHome/Light/int/gFloor/Corridor"
],
"sub_topics_win_g": [
"myHome/Windows",
"myHome/Windows/gFloor"
],
"sub_topics_SW_g": [
"myHome/Light",
"myHome/Light/int",
"myHome/Light/int/gFloor/"
],
"ver": 0.1
}
@Guy . D, 👍0
Обсуждение2 ответа
Лучший ответ:
Если у вас возникает вопрос Как мне прочитать каждый элемент массива, если я не знаю его размера?, просто используйте цикл for, например так:
JsonArray sub_topics_win = doc["sub_topics_win"];
for (const char* topic : pub_gen_topics) {
Serial.println(topic);
}
См. также: JsonArray::begin() / end(), JsonArray::size().
Первой попыткой было JsonArray array = DOC["sub_topic_win"].to<JsonArray>();
. Я попытался создать его как массив, добавив .to<JsonArray>()
, @Guy . D
to<JsonArray>()
создает пустой массив, as<JsonArray>()
преобразует значение в JsonArray
, позволяя вам использовать цикл for., @Benoit Blanchon
Насколько я понимаю, ваш вопрос заключается в следующем: Как определить наилучшую емкость для JsonDocument
, когда мои входные данные различаются?
В таком случае я рекомендую вам прочитать Как определить емкость JsonDocument?. Вот выдержка из раздела "Что делать, если мой ввод отличается?":
Если ваша программа должна десериализовать документ JSON, который изменяется, вы должны выделить
JsonDocument
, который достаточно велик для самого большого допустимого ввода. Я настаиваю на термине действительный, поскольку ваша программа не обязана поддерживать какие-либо документы JSON, а только те, которые имеют отношение к вашему варианту использования.
Применив это к своей проблеме, вам нужно добавить восемь тем в каждый список и передать этот документ ArduinoJson Assistant, что приводит к рекомендуемой емкости 3027 байт на ESP8266. Теперь это немного велико для StaticJsonDocument
, поэтому подумайте о переходе на DynamicJsonDocument.
Извините, что не объяснил себя достаточно хорошо. Ввод, как показано в моем вопросе, считается подходящим для размера 1250. Но в реальной жизни существует ситуация, когда "sub_topics_win"
будет состоять из 8 элементов, а не из 2, как показано.
Когда размер массива известен (2 в демонстрационном примере), я использую цикл for из 2 итераций для чтения этого массива. И мой вопрос: как я могу прочитать массив, когда размер может варьироваться?, @Guy . D
- NodeMCU (Arduino IDE) «DynamicJsonBuffer» не был объявлен в этой области
- Чтение файла из SPIFFS в nodemcu с использованием ArduinoJson
- Получение всех данных моего объекта JSON из Serial.read() сразу
- Последовательная связь от Arduino до ESP8266 NodeMCU работает, но от NodeMCU до Arduino не работает
- Цикл foreach Arduino JSON
- Проанализировать большой ответ json с помощью ESP8266
- Публиковать данные json в mqtt
- ArduinoJSON v6 – передача буфера как параметра функции
https://arduinojson.org/v6/api/jsonarray/size/, @Juraj
@Juraj Я пытался определить
DOC["pub_gen_topics"]
, например, как массив и использовалsize()
, чтобы получить его размер, но безуспешно., @Guy . Dдобавить код в вопрос, @Juraj