当前位置: 代码迷 >> 综合 >> ESP8266 Arduino开发之路(11)— ESP8266中的JSON解析
  详细解决方案

ESP8266 Arduino开发之路(11)— ESP8266中的JSON解析

热度:62   发布时间:2023-12-06 02:50:56.0

ESP8266 Arduino开发之路(11)— ESP8266中的JSON解析

一、前言

解析JSON格式信息是一个较为繁琐的工作,因此我们可以借助ArduionJson库来解析Arduino-ESP8266平台中的SON格式信息。

ArduionJson库的相关信息:

  • 作者:BENOIT BLANCHON
  • 官网:https://arduinojson.org/
  • GitHub: https://github.com/bblanchon/ArduinoJson
  • 第三方下载地址:太极创客网站下载页Arduino/ESP8266-NodeMCU第三方库下载部分

参考:ESP8266 JSON解析

二、ArduionJson库安装

1、在线安装

通过Arduino自带的库管理器来安装,
在这里插入图片描述

2、离线安装

通过GitHub下载离线安装包:https://github.com/bblanchon/ArduinoJson/tree/v6.18.2
在这里插入图片描述
或者在第三方提供的下载地址:百度云盘下载 (提取码:aayu)
在这里插入图片描述
下载好后再加载到ArduinoIDE中,
在这里插入图片描述

三、单一对象JSON解析

编写程序如下:

 /** ESP8266-NodeMCU Json解析程序* 使用ArduinoJson来对Json数据进行解析 * */
#include <ArduinoJson.h>void setup() {
    Serial.begin(115200);Serial.println("");/* 1. 自定义一个Json数据用来解析 */String json_str = "{\"name\":\"william\",\"years\":18}";/* 2. 创建一个DynamicJsonDocument对象*//* 计算创建一个DynamicJsonDocument对象将要占用多大的内存空间 */const size_t capacity = JSON_OBJECT_SIZE(2) + 30;/* 通过计算好的内存空间传入参数创建一个DynamicJsonDocument对象 */DynamicJsonDocument doc(capacity);/* 3. 使用deserializeJson()函数来解析Json数据 */deserializeJson(doc, json_str);/* 4. 获取解析后的数据信息 */String nameStr = doc["name"].as<String>();int yearsInt = doc["years"].as<int>();/* 5. 通过串口监视器输出解析后的数据信息 */Serial.print("json_str = ");Serial.println(json_str);Serial.print("name = ");Serial.println(nameStr);Serial.print("years = ");Serial.println(yearsInt);
}
void loop() {
    }

在该代码中,我们自定义了一个Json数据用来供解析使用

{
    "name":"william","years":18
}

可以看到,该对象含有两个数据对。所以在后面计算DynamicJsonDocument对象占用空间大小时,使用了JSON_OBJECT_SIZE(2),表示1个对象含有2个数据对。另外在JSON_OBJECT_SIZE指令以外还使用+30来额外增加数值,这是由于ArduinoJson库在解析信息时,需要额外的空间来复制JSON信息。

const size_t capacity = JSON_OBJECT_SIZE(2) + 30;

编译上传到开发板后可以看到串口打印如下所示,可以看到,已经解析成功了
在这里插入图片描述

四、JSON数组解析

编写程序如下:

 /** ESP8266-NodeMCU Json解析程序* 使用ArduinoJson来对Json数据进行解析 * */
#include <ArduinoJson.h>void setup() {
    Serial.begin(115200);Serial.println("");/* 1. 自定义一个Json数据用来解析 */String json_str = "[{\"name\":\"william\"},{\"url\":\"www.baidu.com\"}]";/* 2. 创建一个DynamicJsonDocument对象*//* 计算创建一个DynamicJsonDocument对象将要占用多大的内存空间 */const size_t capacity = JSON_ARRAY_SIZE(2) + 2*JSON_OBJECT_SIZE(1) + 60;/* 通过计算好的内存空间传入参数创建一个DynamicJsonDocument对象 */DynamicJsonDocument doc(capacity);/* 3. 使用deserializeJson()函数来解析Json数据 */deserializeJson(doc, json_str);/* 4. 获取解析后的数据信息 */String nameStr = doc[0]["name"].as<String>();String urlStr = doc[1]["url"].as<String>();/* 5. 通过串口监视器输出解析后的数据信息 */Serial.print("json_str = ");Serial.println(json_str);Serial.print("name = ");Serial.println(nameStr);Serial.print("url = ");Serial.println(urlStr);
}

在该代码中,我们自定义了一个Json数据用来供解析使用

[{
    "name":"william"},{
    "url":"www.baidu.com"}
]

可以看到,该JSON数据为一个数组,该数组中含有两个JSON对象元素,所以在后面计算DynamicJsonDocument对象占用空间大小时,使用了JSON_ARRAY_SIZE(2),表示1个数组中含有2个元素,然后每个数组中一个JSON对象,每个对象中有一个数据对,所以使用2*JSON_OBJECT_SIZE(1)计算,另外还使用+60来额外增加数值,这是由于ArduinoJson库在解析信息时,需要额外的空间来复制JSON信息。

const size_t capacity = JSON_ARRAY_SIZE(2) + 2*JSON_OBJECT_SIZE(1) + 60;

编译上传到开发板后可以看到串口打印如下所示,可以看到,已经解析成功了
在这里插入图片描述

五、附录

上一篇:ESP8266 Arduino开发之路(10)— JSON基础
下一篇:ESP8266 Arduino开发之路(12)— HTTP网络服务器

  相关解决方案