ESP8266 уроки. Анализ массивов JSON.

Разработка проектов под заказ

В этом уроке ESP8266 создадим простую программу для анализа строки JSON, которая включает в себя массив целых чисел. Все необходимые библиотеки ESP8266 для Arduino IDE были ранее установлены в предыдущей статье, подробнее здесь.

Кроме того, объяснения, как использовать библиотеку анализа простых пар JSON «имя : значение», можно прочитать в предыдущим уроке.

Подготовка для анализа массива JSON.

Прежде всего, подключим библиотеку, реализующую функцию синтаксического анализа JSON. Которую можно установить с помощью диспетчера библиотек Arduino IDE.

библиотеку ArduinoJson

#include "ArduinoJson.h"

В целях отладки запускаем последовательное соединение в функции настройки setup().

Serial.begin(115200);
Serial.println();  //Перенос на новую строку

Основной цикл программы.

Остальные функции реализуем в основном цикле loop().

В этом уроке проанализируем немного более сложную строку JSON, чем мы делали в предыдущей заметке про esp8266. В этом случае у нас будет тип датчика и массив значений, связанных с этим датчиком.

char JSONMessage[] = "{\"SensorType\":\"Temperature\", \"Value\": [20,21,23]}";

Для удобства чтения, структура показана ниже без экранирующих символов.

{
"SensorType" : "Temperature",
"Value" : [20,21,23]
}

Затем нам нужно объявить объект класса StaticJsonDocument, который будет содержать дерево объектов. Мы указываем значение размера, которое достаточно велико для структуры, которую мы хотим проанализировать (в данном случае это 300 байт).

 StaticJsonDocument<300> parsed;   //Пул памяти

После этого вызываем объект 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);
  }

Поскольку процедура получения проанализированного значения из простой пары «имя / значение» была объяснена в предыдущем уроке, сразу перейдем к тому, как получить значения из массива JSON.

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

int value0=parsed["Value"][0];
int value1=parsed["Value"][1];
int value2=parsed["Value"][2];

В библиотеке ArduinoJson есть несколько полезных методов, которые можно увидеть здесь. Естественно, один из доступных методов позволяет нам получить элемент определенного индекса.

JsonArray& values= parsed["Value"];

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

int arraySize =  parsed["Value"].size();
  for (int i = 0; i< arraySize; i++){
  int sensorValue=parsed["Value"][i];
  Serial.println(sensorValue);
}

Важно: если хотим напрямую вывести значение массива без предварительного сохранения его в целочисленной переменной, нам нужно будет добавить приведение, как показано ниже:

Serial.println(parsed["Value"][i].as<int>());

В противном случае мы получили бы ошибку, показанную на рисунке ниже. В документации к библиотеке есть дополнительная информация о приведении значений.

Вывод параметром полученных из массива JSON.

Итак, чтобы подвести итог, рассмотрим окончательный код, который включает еще несколько дополнительных примеров и проверку на наличие ошибок.
void loop() {

  Serial.println("——————");

  char JSONMessage[] = "{\"SensorType\":\"Temperature\", \"Value\": [20,21,23]}";//Исходное сообщение
  Serial.print("Initial string value: ");
  Serial.println(JSONMessage);

  StaticJsonDocument<300> 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"]; //Получить значение типа датчика
  Serial.println(sensorType);


  int arraySize = parsed["Value"].size();   //получить размер массива JSON
  Serial.print("\nSize of value array: ");
  Serial.println(arraySize);

  Serial.println("\nArray values without explicit casting");
  for (int i = 0; i < arraySize; i++) { 

    int sensorValue = parsed["Value"][i];  //Значения массива без явного приведения
    Serial.println(sensorValue);

  }

  Serial.println("\nArray values with explicit casting");
  for (int i = 0; i < arraySize; i++) {  

    Serial.println(parsed["Value"][i].as<int>());//Значения массива с явным приведением

  }

  Serial.println();
  delay(5000);
}

Вывод параметром полученных из массива JSON.

Откроем монитор порта, и мы должны увидеть следующий результат.

Как видим, вывод массивов JSON не сильно усложняет работу с JSON.

Как видим, вывод массивов JSON не сильно усложняет работу с JSON.

Понравился ESP8266 урок. Анализ массивов JSON? Не забудь поделиться с друзьями в соц. сетях.

А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.

Спасибо за внимание!

Технологии начинаются с простого!

Фотографии к статье

Файлы для скачивания

Скетч анализ массивов JSON. Скетч анализ массивов JSON..ino2 Kb 9 Скачать

Комментарии

Ваше Имя*