ArduinoJSON :: Как определить размер массива в DOC, содержащем не только массивы

json

Файл параметров, содержащий темы 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
}

, 👍0

Обсуждение

https://arduinojson.org/v6/api/jsonarray/size/, @Juraj

@Juraj Я пытался определить DOC["pub_gen_topics"], например, как массив и использовал size(), чтобы получить его размер, но безуспешно., @Guy . D

добавить код в вопрос, @Juraj


2 ответа


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

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


0

Насколько я понимаю, ваш вопрос заключается в следующем: Как определить наилучшую емкость для JsonDocument, когда мои входные данные различаются?

В таком случае я рекомендую вам прочитать Как определить емкость JsonDocument?. Вот выдержка из раздела "Что делать, если мой ввод отличается?":

Если ваша программа должна десериализовать документ JSON, который изменяется, вы должны выделить JsonDocument, который достаточно велик для самого большого допустимого ввода. Я настаиваю на термине действительный, поскольку ваша программа не обязана поддерживать какие-либо документы JSON, а только те, которые имеют отношение к вашему варианту использования.

Применив это к своей проблеме, вам нужно добавить восемь тем в каждый список и передать этот документ ArduinoJson Assistant, что приводит к рекомендуемой емкости 3027 байт на ESP8266. Теперь это немного велико для StaticJsonDocument, поэтому подумайте о переходе на DynamicJsonDocument.

,

Извините, что не объяснил себя достаточно хорошо. Ввод, как показано в моем вопросе, считается подходящим для размера 1250. Но в реальной жизни существует ситуация, когда "sub_topics_win" будет состоять из 8 элементов, а не из 2, как показано. Когда размер массива известен (2 в демонстрационном примере), я использую цикл for из 2 итераций для чтения этого массива. И мой вопрос: как я могу прочитать массив, когда размер может варьироваться?, @Guy . D