• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 (а с переделкой еще разобраться нужно) - это дополнительный геморрой, которого очень хотелось бы избежать. И так сроки реализации задумки сильно затянулись - наверное этот вопрос я отложу для новых версий проекта, а сейчас, хотя бы, первый релиз сделать ... )))
 
Сверху Снизу