Сериализация Json в C (ESP32)

#c #arduino #esp32 #arduinojson

#c #arduino #esp32 #arduinojson

Вопрос:

Я пишу некоторый скрипт для ESP32 и изо всех сил пытаюсь сериализовать json.

Используемые библиотеки — HttpClient и ArduinoJson.

 String payload = http.getString();
Serial.println(payload);
deserializeJson(result, payload);
const char* usuario = result["user"];
Serial.println("##########");
Serial.println(usuario);
  

Полученная полезная нагрузка:

{"ip":"10.57.39.137","area":"[{"id":"3","text":"BOX"}]","user":"[{"id":"6270","text":"ANDRE LARA OLIVEIRA E SILVA"}]","teamId":6,"id":4,"siteId":2,"userCreate":"100059527","dateCreate":"2020-11-19T08:49:03.957","userUpdate":null,"dateUpdate":null}

Мне нужно получить идентификатор и текст из ключа «user». Десериализация и извлечение пользовательского объекта — это нормально. Но result["user"] возвращает: [{"id":"6270","text":"ANDRE LARA OLIVEIRA E SILVA"}] в массив символов. Итак, это что-то вроде json, вложенного в массив … и десериализовать не получается.

Кто-нибудь может мне помочь, как правильно получить значения «id» и «text» из объекта «user»?

Ответ №1:

Библиотека не знает, что содержимое этой строки является допустимым JSON, поэтому вам нужно повторно проанализировать его. Этот код работал у меня на моем ПК, хотя у меня нет Arduino для его тестирования:

 auto payload = "..."; // JSON content here
StaticJsonDocument<1024> resu<
deserializeJson(result, payload);
auto user = result["user"].as<const char*>();

StaticJsonDocument<256> userObj;
deserializeJson(userObj, user);
auto id = userObj[0]["id"].as<int>();
auto text = userObj[0]["text"].as<const char*>();
  

Ответ №2:

«Кто-нибудь может мне помочь, как правильно получить значения «id» и «text» из объекта «user»?»Вы можете получить к ним доступ с помощью

 const char *id = result["user"]["id"];
const char *text = result["user"]["text"];
  

Комментарии:

1. Спасибо, Томас. Я уже пробовал этот подход, но он возвращает мне пустой. Плохо в моем оборудовании то, что у меня нет интерфейса отладки. так что я ограничен последовательной печатью.

2. @alosbh Каков уровень вложенности?

Ответ №3:

Попробуйте:

 const int id = result["user"]["id"];
const char* text = result["user"]["text"];
  

Комментарии:

1. Спасибо ocrdu. Я уже пробовал этот подход, но он возвращает мне пустой. Плохо в моем оборудовании то, что у меня нет интерфейса отладки. так что я ограничен последовательной печатью.