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网络服务器