Как получить конкретное значение из неизвестного числа представлений JSON?

esp8266 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, как описано выше.

Я знаю, что то, что я делаю, далеко не элегантно или "правильно", но я учусь всему этому, поэтому любая критика и помощь более чем приветствуются :)

, 👍0

Обсуждение

Возможно, вы захотите прояснить, почему вы хотите это сделать. Потому что, как бы то ни было, это звучит так, как будто вы просто дублируете данные без всякой причины. И если для этого есть веская причина, то она, скорее всего, придаст какую-то форму ответу., @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


1 ответ


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