Как получить конкретное значение из неизвестного числа представлений JSON?
Я использую ArduinoJson и ESP8266HTTPClient.
Допустим, у меня есть DynamicJsonDocument, который имеет неизвестное количество записей с информацией о разных лицах:
[
{
"ID": "12345",
"name": "John Smith",
"Address": "Street 1"
},
.
.
.
{
"ID": "00345",
"name": "Paul Anderson",
"Address": "Street 2"
}
]
Я хотел бы каким-то образом сохранить значения, связанные с ключом "имя" для всех разных людей. Например, есть что-то вроде:
String name1 = "";
...
String nameN = "";
.
.
.
Serial.println(name1);
...
Serial.println(nameN);
Чтобы распечатать список всех имен:
John Smith
Paul Anderson
Единственная информация о JSON, которая у меня есть заранее, - это ключи, которые будут иметь каждая запись. Я не знаю, сколько там будет записей.
Как я могу это сделать?
EDIT: Почему я хочу это сделать:
Я использую ESP в качестве клиента для получения информации с сервера в виде JSON, аналогичного тому, что я написал выше. В то же время я обслуживаю простой HTML-сайт, выполняя server.send(200, "text/html", HTML_code);
используя ESP в качестве точки доступа. Мне удалось просто втиснуть весь JSON в HTML в виде текста, но я хотел бы просто получить конкретную информацию из JSON, как описано выше.
Я знаю, что то, что я делаю, далеко не элегантно или "правильно", но я учусь всему этому, поэтому любая критика и помощь более чем приветствуются :)
@choreley, 👍0
Обсуждение1 ответ
Непосредственно от помощникаArduinoJson:
// Поток и ввод;
StaticJsonDocument<384> doc;
deserializeJson(doc, input);
for (JsonObject elem : doc.as<JsonArray>()) {
const char* ID = elem["ID"]; // "12345", "13244", "00345"
const char* name = elem["name"]; // "Джон Смит", "Джейсон Стэтхэм", "Пол Андерсон"
const char* Address = elem["Address"]; // "Улица 1", "Улица 2", "Улица 3"
}
См. также:
- Как использовать ArduinoJson с HttpClient?
- Как десериализовать очень большой документ?
Спасибо, я попробую это сделать. Как бы я получил доступ, например, к "Джейсону Стэтхэму" внутри символа "имя"*?, @choreley
Serial.println(имя); // печатает "Джейсон Стэтхэм"
, @Benoit Blanchon
Разве это не напечатает все имена, а не какое-то конкретное?, @choreley
- NodeMCU (Arduino IDE) «DynamicJsonBuffer» не был объявлен в этой области
- Чтение файла из SPIFFS в nodemcu с использованием ArduinoJson
- Последовательная связь от Arduino до ESP8266 NodeMCU работает, но от NodeMCU до Arduino не работает
- Проанализировать большой ответ json с помощью ESP8266
- Публиковать данные json в mqtt
- Какой максимальный размер статического документа Json в Arduino JSON?
- Чтение файла json из SPIFFS и отображение содержащейся в нем информации на встроенной веб-странице
- ESP8266 Arduino Json object array десериализация в структуру
Возможно, вы захотите прояснить, почему вы хотите это сделать. Потому что, как бы то ни было, это звучит так, как будто вы просто дублируете данные без всякой причины. И если для этого есть веская причина, то она, скорее всего, придаст какую-то форму ответу., @timemage
Вы знаете размер из [
JSONArray::size()
](https://arduinojson.org/v6/api/jsonarray/size/) так что просто перебирайте массив, получая каждый объект по очереди. Также рекомендуется использовать [итераторы](https://arduinojson.org/v6/api/jsonarray/begin_end/) вместо цикла for., @MajenkoЯ добавил правку, объясняющую именно это, может быть, теперь это более понятно?, @choreley
ваше объяснение, по-видимому, предполагает, что вы думаете, что HTML-страница должна существовать полностью, прежде чем ее можно будет обслуживать ... вы можете обслуживать веб-страницу по частям ... обслуживать`<html><header>...</header><body>", затем повторять JSON "<div>put name here</div>", а затем обслуживать".</body></html>, @jsotola
для простых извлечений, подобных этому, в прошлом я просто вырывал значения из JSON в виде текста, используя что-то вроде
strstr(json, "\"key\"")
, а затемstrchr(thatString,',')
, чтобы получить диапазон от начальной точки этого ключа. Вы также можете использовать строковые методы, но они, как правило, вызывают проблемы при чрезмерном использовании., @dandavis