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

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

一、前言

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

ArduionJson库的相关信息:

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

  • 6
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值