ArduinoJson — парсинг JSON
JsonDocument, сериализация, разбор API-ответов
Разбираем ответы погодных API и шлём свои данные в формате JSON: StaticJsonDocument, фильтры, сериализация без утечек памяти.
Прогресс раздела0/62 · 0%
- JSON для ардуинщика: синтаксис за десять минутОбъекты, массивы, четыре типа значений, экранирование и вложенность: минимум синтаксиса JSON, чтобы читать ответы API и не путаться в скобках.14 мин
- ArduinoJson: установка и отличия версии 7Установка ArduinoJson через менеджер библиотек и отличия версии 7 от шестой: один JsonDocument вместо Static и Dynamic, сброс документа при разборе.15 мин
- JsonDocument в седьмой версии: один тип вместо двухJsonDocument как пул памяти: авторасчёт ёмкости, замер measureJson, clear и повторное использование, миграция со Static и DynamicJsonDocument.16 мин
- Конфиг в EEPROM: JSON и память настроекПишем JSON-конфиг в EEPROM байт за байтом: метка блока, длина, строка, разбор после перезагрузки, update вместо write и запас ресурса ячеек.16 мин
- Скорость парсинга: тесты и оптимизация размераЗамеряем millis() до и после deserializeJson, считаем микросекунды на байт и ускоряем разбор: фильтр полей, буфер источника, плоские пакеты.16 мин
- Итоговый проект: клиент погодного API с фильтрамиСобираем итоговый клиент погоды: WiFi и GET, фильтр полей, проверки разбора, LCD-экран и порог в EEPROM — весь раздел в одном скетче с командами.17 мин
- Todo-менеджер на Serial: список задач в JSONTodo-менеджер на Serial: команды add/list/done/del, массив объектов {id, text, done} в JSON, лимит 10 задач, документ 1024 байта и светодиод статуса.16 мин
- Меню устройства как JSON-деревоМеню устройства как JSON-дерево: разделы и пункты через createNestedArray, навигация коротким и длинным нажатием кнопки, смена меню с сервера без перепрошивки.16 мин
- История курса: 24 точки в JSON и графикИстория курса из 24 точек одним JSON: разбор массива, кольцевой буфер свежих котировок, ASCII-график столбиками в Serial, LED-вилка от среднего и выход на OLED.15 мин
- Вложенные ответы API: спуск по этажам до нужного поляПрогноз прячет температуру на третьем этаже: объект в массиве в объекте.16 мин
- serializeJson в буфер: char-массив против String и расчёт размераСчитаем байты до отправки: measureJson без нуля, плюс один на терминатор, возврат serializeJson как индикатор тихой обрезки и почему String дробит кучу Uno.16 мин
- Валидация входящего JSON: containsKey, is и as до примененияКлюч пропал или пришёл текстом вместо числа — узел молча ставит ноль и живёт не так.17 мин
- Ответ не влезает в память: разбираем JSON частямиОтвет — 1800 байт, ОЗУ Uno — 2048: считаем пик приёма, режем журнал на чанки по четыре показания и держим сводку min, max, avg вместо 144 значений.16 мин
- ArduinoJson 6 и 7: переносим старые скетчи на новый JsonDocumentЧем v7 отличается от v6: один JsonDocument вместо Static и Dynamic, строки копируются в пул, NoMemory теперь про кучу — и переезд старых скетчей за три шага.15 мин
- NoMemory и расчёт ёмкости: сколько памяти просить у платыПакет печатается на 43 байта, а документ весит вчетверо больше: считаем слоты и строки, сверяем measureJson и ловим тихий пропуск присвоений через overflowed.16 мин
- serializeJsonPretty: сколько стоит человекочитаемый JSONДва формата печати одного документа: serializeJson для программы и serializeJsonPretty для человека.16 мин
- Кавычки, переносы и кириллица: строки в JSONКавычка внутри значения, перенос строки и кириллица: что сериализатор экранирует сам, сколько байт весит UTF-8 и какие строки срывают разбор на настоящей плате.16 мин
- Пакет для сервера: показания в одном JSONОдин пакет вместо россыпи записей: метаданные, массив readings, версия протокола.17 мин
- JSON-команды из монитора: одна строка вместо менюПринимаем JSON-команду из монитора порта: readStringUntil, deserializeJson, containsKey и диспетчер на светодиод — с таймаутом в секунду и переводом строки.16 мин
- JSON Lines-лог: одна строка — одно событиеЛог, где каждая строка самостоятельный JSON: дописывание в конец без скобок, живучесть к обрыву хвоста, grep и tail по событиям; генератор в симуляторе.15 мин
- Конфиг из JSON-строки: старт, проверка, дефолтыНастройки одной строкой: разбор при старте, containsKey расставляет дефолты, стёртая EEPROM из байтов 0xFF возвращает заводские значения — конвейер загрузки.16 мин
- Конфиг на лету: вложенные настройки без перепрошивкиКонфиг по каналу без перепрошивки: вложенные группы настроек, containsKey на группе и ключе, зажим значений и применение на лету — живой ввод в симуляторе.16 мин
- JSON-логи устройства: уровни info и warn в каждой строкеJSON-лог с уровнями: поле lvl в каждой строке, метка millis, источник и короткое сообщение; порог печати, счётчик подавленного и три потребителя лога.16 мин
- Телеметрия трёх датчиков: один документ и его бюджетТри датчика в одном документе: группа sens через createNestedObject, doc.clear перед каждой сборкой и measureJson как предохранитель переполнения пула на Uno.16 мин
- Два документа сразу: запрос и ответ в одной памятиЗапрос и ответ в двух JsonDocument: когда хватает одного, арифметика SRAM Uno на пару документов, локальные против глобальных и предохранитель overflowed.16 мин
- Суточный журнал: массив объектов и цена вложенностиСуточный журнал как массив объектов в JSON: кольцо на 24 записи, сборка to<JsonArray> и арифметика слотов — почему вложенность втрое дороже плоских массивов.16 мин
- JSON и плоттер: один документ, два форматаОдин документ — два формата: пары label=value для Serial Plotter и JSON-строка в журнал на SD.16 мин
- ArduinoJson 7: StaticJsonDocument ушёл, что теперьПул переехал в кучу: StaticJsonDocument и DynamicJsonDocument слились в JsonDocument, ёмкость игнорируется — что меняется на Uno и ESP8266 и когда отложить v7.16 мин
- Фильтр десериализации: берём только нужные поляВложенный фильтр DeserializationOption::Filter на группу main: только temp, humidity и name, выигрыш через memoryUsage и ловушка is<T> на вырезанном поле.16 мин
- JSON-телеграмма датчиков: собираем и шлём раз в минутуТелеграмма {device, ts, t, h, vcc} раз в минуту: цена поля в байтах, serializeJson в char-буфер с предохранителем measureJson и millis-планировщик без delay.15 мин
- Конфиг-файл на SD: читаем настройки в JsonDocumentconfig.json с карты разбирается тем же deserializeJson: File.readString, дефолт для отсутствующих полей, грабля двух открытых файлов и логгер без перепрошивки.16 мин
- OpenWeather по-настоящему: вложенный ответ main/weather[]Настоящая структура ответа OpenWeather: doc["main"]["temp"] и weather[0], float и округление до 0,1, предохранитель на cod 404 и фильтр вместо 2 КБ.16 мин
- Массив измерений: собираем 60 точек в один JSONКопим 60 измерений в кольцевой буфер и отдаём одним JSON: createNestedArray в цикле, размер 900-1200 байт, ловушка int в среднем и цена точек по одной.15 мин
- deserializeJson: разбираем первую строкуdeserializeJson на практике: JsonDocument, чтение поля doc[«temp»] и первая грабля — короткий буфер, из-за которого парсер молча возвращает Err.16 мин
- serializeJson: собираем JSON своими рукамиserializeJson на практике: собираем JsonDocument из показаний датчиков и превращаем его в строку для HTTP-запроса или MQTT-топика без склейки руками.15 мин
- Чтение полей: doc['key'] и оператор |Чтение полей в ArduinoJson: оператор | для значения по умолчанию, вложенный доступ obj[«a»][«b»] и проверка isNull, чтобы отсутствующий ключ не ломал скетч.14 мин
- Home Assistant discovery: генерируем конфиг-топик из кодаDiscovery-паспорт switch на ArduinoJson: топик homeassistant/switch/…/config, payload_on и payload_off, публикация после reconnect и постоянный unique_id.16 мин
- JsonDocument в цикле: clear() против локальногоJsonDocument внутри loop: локальный в каждой итерации крошит кучу ESP32, глобальный без clear() протекает старыми ключами.16 мин
- Конфиг в LittleFS: сохраняем и читаем документconfig.json во флеше ESP32: LittleFS.begin(true) при первом старте, deserializeJson из файла, запись во временный файл с rename против усечения, сравнение с SD.16 мин
- Вложенные объекты: доступ по цепочке ключейЦепочка ключей для вложенного JSON: doc['loc']['city'] на плате, проверка промежуточных звеньев, цена вложенности и разбор вложенного ответа в симуляторе.16 мин
- Массивы JSON: итерация по элементамДлина массива через size(), обход по индексу и range-for, молчаливый ноль за границей и живая итерация по ряду значений с запросом часа из монитора порта.16 мин
- Списки объектов: массив структур из APIПрогноз на три дня как массив объектов: раскладка полей дня в переменные, вердикт по условию, один запрос вместо трёх и честная эмуляция списка в симуляторе.16 мин
- Фильтры ArduinoJson: разбираем только нужноеФильтр DeserializationOption::Filter: второй документ-образец решает, какие ключи попадут в разбор.16 мин
- Фильтры для больших ответов: RAM на вес золотаОтвет на два килобайта при двух килобайтах ОЗУ: бюджет SRAM Uno, фильтр с массивом на первые N часов прогноза и честные границы применимости фильтра.16 мин
- Создание JSON с нуля: doc['key'] = valueПлата собирает свой JSON: присваивание doc['key'] = value, вложенные объекты и массивы в v6 и v7, перезапись ключей и clear перед новой сборкой.15 мин
- Вложенная сериализация: свои объекты и массивыСобираем вложенный JSON: createNestedObject и createNestedArray, список показаний, цена скобок в байтах и дубль ключа, который молча съедает поле.16 мин
- Типы данных JSON: строка, число, bool, nullКавычка делает число строкой, true печатается единицей, null — не ноль: что становится чем при разборе JSON и как ловить сюрпризы печати сырого пакета.16 мин
- Проверка типов: is<T>() и as<T>()containsKey отвечает, был ли ключ; is<T>() — можно ли прочитать значение: guarding полей чужого API и история про режим, который стал числом.15 мин
- DeserializationError: коды ошибок и диагностикаШесть кодов DeserializationError: EmptyInput, InvalidInput, IncompleteInput, NoMemory, TooDeep — причины, диагностика через err.c_str() и разбор в симуляторе.16 мин
- Размер документа: measureJson и оценка памятиmeasureJson считает байты JSON до печати: буфер с запасом, вес пакета на канале и бюджет памяти Uno против ESP32 — раскладываем документ по полкам.16 мин
- Строки и ArduinoJson: const char*, String и копииКто владеет строкой после разбора: const char* смотрит в источник, String и char-буфер дают свои копии — копируем значения до перезаписи пакета.16 мин
- strdup и копирование строк: ловушки указателейКуда указывает doc['name'] после разбора и почему строка умирает вместе с документом: копия в String, char-буфер или strdup — с ценой в байтах и ловушками.16 мин
- JSON через UART: парсим поток из SerialСоседний узел шлёт JSON по проводу: склеиваем строку посимвольно до маркера конца, разбираем deserializeJson и отвечаем.17 мин
- Погодный API: парсим ответ OpenWeatherMapАнатомия ответа OpenWeatherMap: где прячутся temp и description, почему weather — массив, ловушка Кельвинов и разбор сокращённого ответа в симуляторе.16 мин
- OpenWeatherMap в проекте: прогноз на дисплееПогодная панель на ESP32 и LCD: ключ OpenWeatherMap, параметр units=metric, вложенный main.temp, разбор ArduinoJson и вывод температуры с описанием на экран.16 мин
- Курс валют из API: массив котировокТабло курсов валют: JSON с котировками, вложенный объект rates, точность float и число знаков при печати, запасные значения через | и светодиод на пороге курса.15 мин
- JSON в теле POST: формируем запрос правильноСобираем тело POST-запроса через ArduinoJson: doc и serializeJson, Content-Length по measureJson, заголовок Content-Type и разбор JSON-ответа сервера.16 мин
- Массивы массивов: вложенные списки без паникиВложенные массивы в JSON: таблица день и ночь из внешнего узла, двойные индексы doc["week"][d][0], порядок циклов и цена каждого уровня вложенности.16 мин
- График температуры: 100 точек в JSONПакуем историю измерений в один JSON: сотня точек вместо сотни запросов, байты и секунды канала, разбор с минимумом и максимумом, график в мониторе порта.16 мин
- Конфигурация в JSON: настройки устройства файломНастройки устройства одной JSON-строкой: разбор, проверка диапазонов, применение без перепрошивки и копия порогов в EEPROM на случай перезагрузки.17 мин
- ArduinoJson: разбираем JSON без болиРазбираем ответ погодного API через ArduinoJson: JsonDocument и его цена в байтах, SRAM Uno 2 КБ, deserializeJson по шагам и чтение значений в симуляторе.18 мин
- Собираем свой JSON и отправляем на серверСобираем JSON для сервера без String-конкатенации: doc и присвоение ключей, serializeJson и serializeJsonPretty, телеметрия по таймеру в симуляторе.16 мин