Библиотека ArduinoJson
ArduinoJson доступна через менеджер библиотек в Arduino IDE. Для работы с библиотекой нужно включить заголовочный файл.
#include
Пример десериализации файла и вывод только необходимых данных показан в статье Узнаём погоду через OpenWeatherMap.
Создание JSON-файла
Рассмотрим пример создания JSON-файла с необходимыми данными.
#include void setup() < Serial.begin(115200); StaticJsonDocumentjsonDocument; jsonDocument["sensorType"] = "Temperature"; jsonDocument["value"] = 16; char buffer[100]; serializeJsonPretty(jsonDocument, buffer); Serial.println(buffer); > void loop() <>
В мониторе порта смотрим, как выглядит запись в JSON-формате.
MessagePack. Сериализация
Кроме текстового формата JSON существует бинарный формат MessagePack. Честно признаюсь, никогда о нём не слышал до чтения примеров для библиотеки. MessagePack имеет преимущество — он эффективен для передачи данных, занимая меньше места. Это может оказаться решающим фактором при больших объёмах данных.
Пример с сериализацией не сильно отличается от аналогичного примера для JSON.
#include void setup() < Serial.begin(115200); StaticJsonDocumentjsonDocument; jsonDocument["sensorType"] = "Temperature"; jsonDocument["value"] = 10; // требуемый int expectedBytesToWrite = measureMsgPack(jsonDocument); Serial.print("Expected Bytes: "); Serial.println(expectedBytesToWrite); // char buffer[100]; int bytesWritten = serializeMsgPack(jsonDocument, buffer); Serial.print("Bytes written: "); Serial.println(bytesWritten); for (int i = 0; i < bytesWritten; i++) < Serial.printf("%02X ", buffer[i]); >> void loop() <> // Результат // Expected Bytes: 31 // Bytes written: 31 // 82 AA 73 65 6E 73 6F 72 54 79 70 65 AB 54 65 6D 70 65 72 61 74 75 72 65 A5 76 61 6C 75 65 0A
Проверить корректность данных можно на сайте msgpack-lite, декодируя набор байт.
В коде есть код, обрамлённый комментариями. Он позволяет узнать требуемый размер сообщения до отправки, не пересылая сами данные. Это пригодится, чтобы оценить объём данных и принять решение об отправке. Во время отправки сообщения этот код избыточен, так как при отправке сообщения мы можем уже сами посчитать количество отсылаемых байтов.
Работа с JSON
Работа с JSON (JavaScript Object Notation) включает в себя манипуляцию данными, структурированными в лёгком для чтения и написания текстовом формате, который также удобен для анализа и генерации машинами. Программисты используют JSON в проектах для Arduino для общения с веб-сервисами, обмена данными и беспрепятственной настройки устройств.
Как:
Для работы с JSON на Arduino вам понадобится библиотека ArduinoJson. Установите её через Менеджер Библиотек: Эскиз > Подключить Библиотеку > Управление Библиотеками…, затем найдите “ArduinoJson” и установите.
Вот простой пример разбора JSON:
#include const char* json = "\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]>"; void setup() Serial.begin(9600); DynamicJsonDocument doc(1024); deserializeJson(doc, json); const char* sensor = doc["sensor"]; long time = doc["time"]; double широта = doc["data"][0]; double долгота = doc["data"][1]; Serial.print("Датчик: "); Serial.println(sensor); Serial.print("Время: "); Serial.println(time); Serial.print("Широта: "); Serial.println(широта, 6); Serial.print("Долгота: "); Serial.println(долгота, 6); > void loop() // В этом примере не используется. >
Датчик: gps Время: 1351824120 Широта: 48.756080 Долгота: 2.302038
#include void setup() Serial.begin(9600); DynamicJsonDocument doc(1024); doc["sensor"] = "gps"; doc["time"] = 1351824120; doc["data"][0] = 48.756080; doc["data"][1] = 2.302038; serializeJson(doc, Serial); > void loop() // В этом примере не используется. >
Подробнее
Библиотека ArduinoJson, авторства Benoit Blanchon, стала де-факто стандартом для манипуляции с JSON в Arduino. JSON приобрёл популярность за свою простоту по сравнению с XML, который был широко использован ранее. Существуют альтернативы, такие как MsgPack, но JSON остаётся в фаворитах за его текстовую читаемость и широкое применение. С точки зрения реализации, убедитесь, что вы выделили достаточно памяти для DynamicJsonDocument , чтобы избежать переполнения и используйте StaticJsonDocument для статических или объектов JSON известного размера.
Смотри также
- Документация по библиотеке ArduinoJson: https://arduinojson.org/
- Официальный веб-сайт JSON: https://www.json.org/json-en.html
- Форум Arduino для обсуждений: https://forum.arduino.cc/
- Руководство по выбору между StaticJsonDocument и DynamicJsonDocument: https://arduinojson.org/documentation/memory-model/
Json arduino как использовать
How to use ArduinoJson with HTTPClient?
What is HTTPClient ?
HTTPClient is a class that performs HTTP requests on ESP8266 and ESP32.
Assuming that the board is connected to the WiFi network, you can send an HTTP request like so:
WiFiClient client; // or WiFiClientSecure for HTTPS HTTPClient http; // Send request http.begin(client, "http://arduinojson.org/example.json"); http.GET(); // Print the response Serial.print(http.getString()); // Disconnect http.end();
While you can perform HTTP request without HTTPClient (cf “See also” below), this class greatly simplifies your code.
On ESP8266, this class is provided by the ESP8266HTTPClient library, which is bundled with the ESP8266 core for Arduino.
On ESP32, it’s provided by the HTTPClient library, which is bundled with the Arduino core for the ESP32.
For HTTPS, you need to use WiFiClientSecure instead of WiFiClient .
You must also choose the certificate validation strategy by calling WiFiClientSecure::setInsecure() , for example.
How to parse a JSON document from an HTTP response?
Unfortunately, HTTPClient doesn’t implement the Stream interface, so you cannot pass it directly to deserializeJson() like so:
deserializeJson(doc, http); // error: 'class HTTPClient' has no member named 'read'; did you mean 'end'?
We could pass the result of http.getString() directly to deserializeJson() , but it would be quite inefficient because it would copy the complete response in RAM before parsing.
We can do much better by letting ArduinoJson pull the bytes from the HTTP response. To do that, we must get HTTPClient ’s underlying Stream by calling http.getStream() instead of http.getString() .
Unfortunately, by using the underlying Stream , we bypass the code that handles chunked transfer encoding, so we must switch to HTTP version 1.0.
WiFiClient client; // or WiFiClientSecure for HTTPS HTTPClient http; // Send request http.useHTTP10(true); http.begin(client, "http://arduinojson.org/example.json"); http.GET(); // Parse response DynamicJsonDocument doc(2048); deserializeJson(doc, http.getStream()); // Read values Serial.println(doc["time"].aslong>()); // Disconnect http.end();
Remember to call useHTTP10(true) when you use getStream() , or deserializeJson() will return InvalidInput .
Notice that I used a DynamicJsonDocument here because the document is quite large. Feel free to use a StaticJsonDocument if your document is smaller. As always, use the ArduinoJson Assistant to compute the right capacity for your project.
How to send a JSON document in an HTTP request?
Unfortunately, HTTPClient doesn’t let us use the same trick as above, so we have to use a temporary buffer. Here is how we can do so with a String :
// Prepare JSON document DynamicJsonDocument doc(2048); doc["hello"] = "world"; // Serialize JSON document String json; serializeJson(doc, json); WiFiClient client; // or WiFiClientSecure for HTTPS HTTPClient http; // Send request http.begin(client, "http://httpbin.org/post"); http.POST(json); // Read response Serial.print(http.getString()); // Disconnect http.end();
If you run this program, you’ll see that it prints information on the HTTP requests. That’s the response returned by httpbin.org; it’s very handy to debug your programs.
If you want to send the payload as a stream, you need to use WiFiClient directly, as shown in the Serialization Tutorial (around page 127).
Why is the JsonDocument empty?
The most likely explanation is that the server returned a redirection code, like 301 Moved Permanently or 302 Found.
http.setFollowRedirects(HTTPC_FORCE_FOLLOW_REDIRECTS);
This feature was added quite recently on ESP32, so make sure you are up-to-date.
BONUS: How to see the document when I use a Stream ?
As we saw, it’s more efficient to pass the Stream to deserializeJson() because it saves a large amount of memory. However, we cannot directly print the content of the Stream to see what was sent to ArduinoJson.
To see the content that is received from the HTTP response, we can use the ReadLoggingStream from the StreamUtils library.
deserializeJson(doc, http.getStream());
ReadLoggingStream loggingStream(http.getStream(), Serial); deserializeJson(doc, loggingStream);
ReadLoggingStream will forward everything to deserializeJson() and will print the content to the serial port.
StreamUtils is a powerful library that deserves more attention. Please give it a star to spread the word.
See also
- The GitHub example in chapter 3 of Mastering ArduinoJson uses HTTPClient to interact with GitHub’s API.
This chapter is available for free, see Deserialization Tutorial. - The Reddit case study in chapter 8 of Mastering ArduinoJson shows how to perform HTTP requests without HTTPClient .
ESP8266 уроки. Анализ JSON в среде Arduino IDE.
В этом уроке ESP8266 создадим простую программу для синтаксического анализа строки JSON, имитирующей данные с датчика, и вывод полученных значений в последовательный порт. Для данного урока вам нужно установить библиотеки ESP8266 для Arduino IDE, о чем рассказывал здесь.
Чтобы избежать ручного декодирования строки в пригодные для использования значения, будем использовать библиотеку ArduinoJson, которая предоставляет простые в использовании классы и методы для синтаксического анализа JSON. С библиотекой и ее возможностями можно ознакомиться на GitHub.
Эта очень полезная библиотека позволяет, как кодировать, так и декодировать JSON, она очень эффективна и работает на ESP8266. Её можно установить через «менеджер библиотек» Arduino IDE, как показано на рисунке ниже.

Основные настройки для работы esp8266 json http.
Прежде всего, необходимо подключить библиотеку ArduinoJson, реализующую функцию синтаксического анализа.
#include "ArduinoJson.h"
Поскольку в этой библиотеке есть некоторые приемы, позволяющие избежать проблем при ее использовании, в этом уроке будет показано, как анализировать локально созданную строку, и поэтому мы не будем использовать функции WiFi. Итак, мы просто запустим последовательное соединение. Но вы можете использовать esp8266 json http на основании предыдущих уроков.
void setup() < Serial.begin(115200); Serial.println(); //Перенос на новую строку >
Основной код разбора JSON с помощью ESP8266.
В функции основного цикла loop() объявим сообщение JSON, которое будет проанализировано. Символы «\» используются для экранирования двойных кавычек в строке, поскольку имена JSON требуют двойных кавычек.
char JSONMessage[] ="";
Эта простая структура состоит из 2 пар «имя : значение», соответствующих типу датчика и значению для этого датчика. Для удобства чтения, структура JSON данных показана ниже без экранирования символов.
Затем нам нужно объявить объект класса StaticJsonDocument. Он будет соответствовать предварительно выделенному пулу памяти для хранения дерева объектов, и его размер указывается в параметре шаблона (значение между <> ) в байтах.
StaticJsonDocument parsed; //Пул памяти
В этом случае мы объявили размер 300 байт, что более чем достаточно для строки, которую хотим проанализировать. Автор библиотеки указывает здесь два подхода к определению размера буфера. Лично я предпочитаю объявлять буфер, имеющий достаточный размер для ожидаемой полезной нагрузки сообщения, и проверять наличие ошибок на этапе синтаксического анализа.
Библиотека также поддерживает динамическое выделение памяти, но такой подход не рекомендуется.
Затем вызываем объект DeserializationError, передавая строку JSON в качестве аргумента.
// Десериализация документа JSON DeserializationError error = deserializeJson(parsed, JSONMessage);
Чтобы проверить, успешно ли был проанализирован JSON, проверим, удалось ли выполнить синтаксический анализ.
// Проверьте, удастся ли выполнить синтаксический анализ. if (error) < Serial.print(F("deserializeJson() failed: ")); Serial.println(error.f_str()); return; >else < //Вывести если ошибок нет Serial.println("There are no errors"); delay(5000); >
После этого можем использовать оператор индекса для получения проанализированных значений по их именам. Проверяем здесь информацию об операторе нижнего индекса. Другими словами, это означает, что мы используем квадратные скобки и имена параметров для получения их значений, как показано ниже
const char* sensorType = parsed["SensorType"]; //Получить значение типа датчика int value = parsed["Value"]; //Получить значение измерения датчика
Код основного цикла программы показана ниже. Мы включили несколько дополнительных выводов информации, чтобы отделить каждую итерацию функции цикла и показать, как исходная строка изменяется при синтаксическом анализе. Нам нужно напечатать значения char из char, потому что синтаксический анализатор включает символы «\0», и поэтому, если бы мы использовали Serial.println (JSONMessage), мы бы просто видели содержимое до первого символа «\0».
void loop() < Serial.println("——————"); char JSONMessage[] = " "; //Исходное сообщение Serial.print("Initial string value: "); Serial.println(JSONMessage); StaticJsonDocument parsed; //Пул памяти // Десериализация документа JSON DeserializationError error = deserializeJson(parsed, JSONMessage); // Проверьте, удастся ли выполнить синтаксический анализ. if (error) < Serial.print(F("deserializeJson() failed: ")); Serial.println(error.f_str()); return; >else < //Вывести если ошибок нет Serial.println("There are no errors"); delay(5000); >const char* sensorType = parsed["SensorType"]; //Получить значение типа датчика int value = parsed["Value"]; //Получить значение измерения датчика Serial.println(sensorType); Serial.println(value); Serial.print("Final string value: "); for (int i = 0; i < 35; i++) < //Выведите измененную строку после синтаксического анализа Serial.print(JSONMessage[i]); Serial.print(" "); >Serial.println(); delay(5000); >
Проверка кода вывода значений полученных из JSON с помощью ESP8266 (NodeMCU).
Чтобы протестировать код, просто скомпилируйте его, и загрузите на плату ESP8266 (NodeMCU). После этого откройте последовательный монитор Arduino IDE. На рисунке ниже показан результат, вывода данных в последовательный порт.

Как видим, у этой библиотеки есть некоторые особенности, которые должны учитывать при ее использовании, чтобы избежать неожиданных проблем. К счастью, страница этой библиотеки на GitHub очень хорошо документирована, и поэтому здесь есть раздел, описывающий, как избежать ошибок.
Кроме того, настоятельно рекомендую проверить примеры программ, которые устанавливаются вместе с библиотекой, которые очень хорошо подходят для понимания того, как она работает.

Заключение к уроку Arduino json esp8266.
В этом уроке показано, как легко анализировать JSON при помощи ESP8266 в среде Arduino. Естественно, это позволяет изменять данные в хорошо известном структурированном формате, который может быть легко интерпретирован другими приложениями, без необходимости реализации определенного протокола.
Поскольку микроконтроллеры и устройства IoT имеют ограниченные ресурсы, JSON создает гораздо меньше расходов ресурсов, чем, например, XML, и поэтому является очень хорошим выбором.
Тем не менее, нужно иметь в виду, что для некоторых интенсивных приложений даже JSON может создавать недопустимые нагрузки, и поэтому нам может потребоваться перейти на байтовые протоколы. Но для простых приложений, таких как чтение данных с датчика и отправка их на удаленный сервер или получение набора конфигураций, JSON является очень хорошей альтернативой.
Понравился ESP826 урок. Анализ JSON в среде Arduino IDE? Не забудь поделиться с друзьями в соц. сетях.
А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.
Спасибо за внимание!
Технологии начинаются с простого!