ArduinoJson парсер: примеры в браузере — разбор JSON без платы
ArduinoJson — библиотека номер один для парсинга JSON в скетчах: телеметрия с OpenWeather, настройки из EEPROM, обмен с MQTT-брокером. На бумаге просто: deserializeJson(doc, json), doc["temp"].as<float>(). На практике новички теряются: в v6 JsonDocument выделял память сам, в v7 нужен JsonDocument или Splice-буфер; doc["temp"] — это const char*, а не float, без .as<float>() парсер молча отдаёт 0; вложенный массив — doc["sensors"][0]["name"] без проверки — приложение падает на первом «битом» пакете.
JsonLab встроен в наш симулятор — это интерактивный парсер в браузере: вводите JSON, видите, как его разберёт ArduinoJson, сколько памяти уходит, где случилась DeserializationError. Ниже — примеры парсинга, разбор v6 vs v7, и кросс-ссылки на 30+ уроков раздела ArduinoJson.
Минутный пример: parse объекта
#include <ArduinoJson.h> const char* json = "{\"temp\":22.5,\"hum\":45}"; void setup() { Serial.begin(9600); JsonDocument doc; // v7: вместо StaticJsonDocument<200> DeserializationError err = deserializeJson(doc, json); if (err) { Serial.print("oshibka parsinga: "); Serial.println(err.c_str()); return; } float t = doc["temp"]; // неявное as<float> int h = doc["hum"]; // неявное as<int> Serial.print("T="); Serial.print(t, 1); Serial.print(" H="); Serial.println(h);} void loop() {}Скетч вставьте в основной симулятор: компилятор поймёт ArduinoJson v7, и монитор порта напечатает «T=22.5 H=45». Проверка: поменяйте json на «{"temp":"hot"}» — парсер вернёт 0 для float, и вы увидите граблю неявного приведения. Полный разбор API v7 и миграции с v6 — в уроке про установку ArduinoJson v7 и уроке про v6 vs v7 миграцию.
Живая валидация JSON, инспектор полей и скетч с doc["ключ"], который растёт из вашего текста.
Подгружаем интерактив…
Лаборатория выше — интерактивный парсер в браузере: вставьте JSON, увидите, как его разбирает ArduinoJson, сколько памяти уходит, и какие ошибки выскакивают. Удобно подбирать размер JsonDocument под конкретный payload: правите поля, смотрите число в «байт» — и подставляете в скетч.
Вложенные объекты и массивы
#include <ArduinoJson.h> const char* json = "{\"city\":{\"name\":\"Moscow\",\"country\":\"RU\"}," "\"main\":{\"temp\":-3.2,\"pressure\":1015}}"; void setup() { Serial.begin(9600); JsonDocument doc; DeserializationError err = deserializeJson(doc, json); if (err) { Serial.print("err: "); Serial.println(err.c_str()); return; } const char* name = doc["city"]["name"]; // путь через [] float t = doc["main"]["temp"]; int p = doc["main"]["pressure"]; Serial.print(name); Serial.print(" "); Serial.print(t, 1); Serial.print("C "); Serial.print(p); Serial.println("hPa");} void loop() {}Вложенный объект — путь через квадратные скобки: doc["city"]["name"]. Если поля нет, парсер вернёт nullptr или 0 — проверяйте через doc["city"].containsKey("name") в v6 или isNull() в v7. Разбор вложенных объектов и цепочек — в уроке про вложенные объекты.
Массивы и итерация
#include <ArduinoJson.h> const char* json = "[{\"id\":1,\"val\":22.5}," "{\"id\":2,\"val\":23.1}," "{\"id\":3,\"val\":21.8}]"; void setup() { Serial.begin(9600); JsonDocument doc; deserializeJson(doc, json); JsonArray arr = doc.as<JsonArray>(); for (JsonObject obj : arr) { int id = obj["id"]; float v = obj["val"]; Serial.print("id="); Serial.print(id); Serial.print(" val="); Serial.println(v, 1); }} void loop() {}Массив JSON — это JsonArray, и итерация через for-loop по JsonObject даёт доступ к каждому элементу. В v7 doc.as<JsonArray>() разворачивает документ в массив; в v6 — doc.as<JsonArray&>(). Полный разбор — в уроке про массивы и итерацию.
v6 vs v7: что поменялось
| Что | v6 | v7 |
|---|---|---|
| Выделение памяти | StaticJsonDocument<N> с фиксированным размером | JsonDocument — внутри Dynamic с резервированием |
| Доступ к полям | doc["temp"].as<float>() | doc["temp"] с неявным приведением |
| containsKey | doc.containsKey("name") | удалён — используйте isNull() |
| Copy | DeepCopy | не нужен — присваивание копирует |
| Проблемы памяти | переполнение буфера — обрезается | выделяется динамически — не обрезается |
В v7 JsonDocument сам растёт под payload, и StaticJsonDocument уходит в прошлое — вместе с подсчётом байтов через measureJson. В v6 нужно было вручную считать размер, в v7 — измерять через measureJson только для оценки перед отправкой, а не перед парсингом. Миграция — в уроке про v6 vs v7.
Грабли ArduinoJson
- doc["temp"] без .as<float>() в v6: парсер возвращает const char*, и float получает 0. В v7 неявное приведение работает, но проверяйте тип через is<float>().
- Забытый deserializeJson: doc пустой, и все поля возвращают 0/nullptr. Сначала deserializeJson, потом чтение.
- DeserializationError не проверен: битый JSON молча даст 0, и вы гадаете, что не так. Сравните err.c_str() с «EmptyInput», «IncompleteInput», «InvalidInput».
- JsonDocument глобальный в v7: до v7 — статический в setup(), в v7 — на стеке или в куче. Глобальный документ в v6 терял память при переполнении.
- Сериализация в строку: serializeJson(doc, String) в v6 часто копировал лишний раз; в v7 — serializeJson(doc, buffer, sizeof(buffer)) копирует один раз.