• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Разбор JSON

ESP-01S

Member
Доброго всем дня.

Подскажите в ситуации:

HTML страница через ajax отдает в ESP строку JSON -
[{"day":1,"hr":"00","min":"00","state":0},{"day":3,"hr":"00","min":"00","state":1},{"day":5,"hr":"00","min":"00","state":1},{"day":0,"hr":"00","min":"00","state":1}]
Количество вложений {"day":1,"hr":"00","min":"00","state":0} заведомо не известно.

Задача стоит разобрать ее в двумерный массив для последующего использования.
Обычный JSON спокойно разбирается библиотекой ArduinoJson.h версии 5 от Benoit Blanchon (https://arduinojson.org/), а вот со вложенными элементами - засада ...
 

enjoynering

Well-known member
В ArduinoJson6 разбирал вложенный 2х мерный массив с OpenWatherMap. Все работает. Посмотрите примеры в интернете. Про то как узнать колличество строк в 2х мерном массиве в ArduinoJson6 не знаю, никогда не было такой задачи.
 

enjoynering

Well-known member
добрался до компа. вот пример вытаскивания иконки OpenWatherMap из вложенного массива

Код:
weatherData.icon = jsonDoc["weather"][0]["icon"].as<String>();
 

ESP-01S

Member
Пошли третьи сутки мытарств, а JSON так и не поддается.
Очевидно что-то не так с входящей строкой ...

Строка вида
[
{"day":1,"hr":"00","min":"00","state":0},
{"day":2,"hr":"06","min":"30","state":1},
{"day":4,"hr":"03","min":"15","state":0},
{"day":5,"hr":"15","min":"50","state":1}
]
формируется и отправляется:

JavaScript:
 $("#saveList").click(function () {
            matrix = [];
            cnt = 0;
            $("#scheduleList .alarmList").each(function () {
                $el = $(this);
                matrix.push({
                    day: days.indexOf($el.find("#Day").text()),
                    hr: $el.find("#Hrs").text(),
                    min: $el.find("#Min").text(),
                    state: state.indexOf($el.find("#Type").text())
                });
                cnt++;
            });
         jQuery.ajax({
                url: "saveAlarmList", 
                type: "POST", 
                dataType: false, 
                data: '&list=' + JSON.stringify(matrix), 
                success: function (response) { 
                    console.log(response);
                },
                error: function (response) { 
                    alert('Ошибка отправки сообщения' + data);
                }
            });

        });

Строка принимается:
C++:
void getList() {
    String tmpList = HTTP.arg("list");
    DynamicJsonBuffer jsonBuffer;
    
    JsonObject& root = jsonBuffer.parseObject(tmpList);
    Serial.print ("List: "); Serial.println (tmpList);
    
    root.printTo(Serial); Serial.println (""); // выводит {}
    
    HTTP.send(200, "text/plain", "OK");   // ответ о выполнении
}
В итоге строка приходит, но root.printTo(Serial); выводит {}, т.е. JSON пустой.

Подскажите, где я недоглядел ...
 

CodeNameHawk

Moderator
Команда форума

ESP-01S

Member
When you pass a Stream to JsonObject:: printTo(), it writes the JSON document to the stream but doesn’t print anything to the serial port ...
Спасибо за указание на момент, но в данном случае, увы, он не имеет определяющего значения: я же не "кормлю" Stream - передается обычный String.
А вот за ссылку на assistant отдельное СПАСИБО! - благодаря ей вопрос разрешился:

C++:
void saveList() {
    String tmpList = HTTP.arg("list");
    DynamicJsonBuffer jsonBuffer;
    
    JsonArray& root = jsonBuffer.parseArray(tmpList);
    Serial.print ("alarmList: "); Serial.println (tmpList);

    root.printTo(Serial); Serial.println ("");
    Serial.print ("[0]           : "); Serial.println (root[0].as<String>());
    Serial.print ("[0] [\"day\"] : "); Serial.println (root[0]["day"].as<String>());

    
    HTTP.send(200, "text/plain", "OK");   // отправляем ответ о выполнении
}
В итоге получаем в мониторе:
Код:
alarmList: [{"day":1,"hr":"00","min":"00","state":0},{"day":2,"hr":"00","min":"00","state":0},{"day":3,"hr":"00","min":"00","state":0}]
[{"day":1,"hr":"00","min":"00","state":0},{"day":2,"hr":"00","min":"00","state":0},{"day":3,"hr":"00","min":"00","state":0}]
[0]           : {"day":1,"hr":"00","min":"00","state":0}
[0] ["day"]   : 1
Всем спасибо, вопрос решен.
До встречи в онлайне, ибо, судя по задумке, этот вопрос был не последний ... )))
 

ESP-01S

Member
Посмотрите на JSON 6 версии, пятая устарела.
Да, я уже обратил на это внимание, но проект начинался на 5 версии и переделывать его под обновленную 6 (а с переделкой еще разобраться нужно) - это дополнительный геморрой, которого очень хотелось бы избежать. И так сроки реализации задумки сильно затянулись - наверное этот вопрос я отложу для новых версий проекта, а сейчас, хотя бы, первый релиз сделать ... )))
 
Сверху Снизу