ESP8266 学习 十一 ESP8266 JSON解析

  • 解析JSON格式信息是一个较为繁琐的工作,因此我们将借助解析Arduino – ESP8266平台中解析JSON格式信息的第三方库——ArduionJson库。该库是目前最受好评的解析JSON信息第三方库。其基本信息如下:
  • 官网:ArduinoJson: Efficient JSON serialization for embedded C++
  • ArduinoJSON – JSON解析 百度云盘下载 (提取码:aayu) GitHub
  • 下载完之后 导入库 zip库

  • 网上有很多网页JSON工具供我们使用。这里我们推荐您我们使用多年的oktools.net网站JSON在线工具。您可以使用该工具解析JSON文件,也可以用它来验证编写的JSON是否符合语法规则。 如图就可以查看json解析结果

  • 如图解析结果可以看见 包含一个对象object 一个名值对 results 0{3}就是说 0号数组里有3个对象(名值对) 接下来就是 对3个名值对的具体内容解析

     

     

    • 单一对象解析:在以下示例中,您将会看到如何使用ESP8266配合ArduinoJson库来解析只有一个对象的简单JSON信息。该信息如下
      • 代码:

         

         

         

         

         

         

        • 重点1: 建立了DynamicJsonDocument doc(capacity); 名为doc的对象,然后定义一个参数 capacity 来定义尺寸大小 因为该库是基于c++的 因此只要是c++的都可以用此库进行JSON 解析 size_t 相当于无符号长整型变量。可以存出32位数据。unsigned long 因为json解析的时候是要在内存里开辟一段空间的 因此在解析之前就要先确定解析文件的尺寸 也就是文件大小。 参数2为有两个名值对的JSON对象。 后面的30是留下的内存余量 就例如下面这个例子:
          • 以上JSON对象中包含有3个数据。在计算解析它所需要占用的内存大小时,我们将要使用语句:const size_t capacity = JSON_OBJECT_SIZE(3) + 60;
          • 讲到这里可能细心的朋友已经发现了,在以上语句中除了JSON_OBJECT_SIZE指令以外还使用+ 60来额外增加数值。
        • 重点二: JSON的原内容
        • 重点3:反序列化数据

           

          • 这部分语句的作用是使用deserializeJson来对JSON文件进行解析。其中第一个参数是我们重点1讲解的DynamicJsonDocument对象,第二个参数是重点2讲解的json字符串。 两个参数 第一个是 josn文件的尺寸大小 第二个是json 的原内容
        • // 重点4:获取解析后的数据信息

           

          • 这两条语句用于获取解析后的JSON信息,其中doc["name"].as将会返回“name”的值。这条语句中.as将会让“name”的值以字符串的形式返回。
          • 另一条语句中doc["number"].as()自然就是以整数形式来返回”number”的数据值
          • doc 适用于解析的名值对 第一个参数是要去解析name 第二个参数是number .as<数据类型>() 是将解析好的数据进行类型转换的。
        • 编译上传 验证 :
        • 我们对实例进行修改 可见关键地方就是只有三个重点,其我们还不明白的就是 size_t 的大小确定
      • JSON数组解析:

         

         

        • 以下示例演示了如何使用ArduinoJson库解析一个JSON数组信息。该信息如下: 该数组有两个元素,每个元素都是一个JSON对象,每个对象都有一个数据
        • 代码解析:
        • 重点1:

           

          • DynamicJsonDocument doc(capacity);
          • 与以上示例相同,这里我们建立了DynamicJsonDocument对象,该对象名称为doc。doc对象的capacity参数用于设置解析JSON所需要的内存大小。这个空间大小是由语句const size_t capacity = JSON_ARRAY_SIZE(2) + 2*JSON_OBJECT_SIZE(1) + 60;计算出来的。
          • 我们可以看到,以上JSON信息是一个数组,该数组含有两个元素。因此,我们在计算capacity时首先使用了语句JSON_ARRAY_SIZE(2)来获得含有两个元素的数组所占用内存的大小。
          • 然后就是 因为这两个数组元素都是含有一个数据对对象,因此利用JSON_OBJECT_SIZE(1) 可以得到一个数据对象的大小,因为有两个所以就需要 乘 2 加上余量。
          • 我们用JSON在线解析工具可以横清楚的知道所获取的尺寸大小 const size_t capacity = JSON_ARRAY_SIZE(2) + 2*JSON_OBJECT_SIZE(1) + 60 首先是两个数组元素的大小获取,然后是object 对象的大小获取 加上余量。
        • 重点2
          • String json = "[{\"name\":\"taichi-maker\"},{\"website\":\"www.taichi-maker.com\"}]";
          • String json = "[{\"name\":\"taichi-maker\"},{\"website\":\"www.taichi-maker.com\"}]";

          • 这条语句的作用是建立字符串变量,改变里用于存储需要解析的JSON信息。 最关键的是 格式的书写
        • 重点3:
          • deserializeJson(doc, json);
          • 这部分语句的作用是使用deserializeJson来对JSON文件进行解析。其中第一个参数是我们重点1讲解的DynamicJsonDocument对象,第二个参数是重点2讲解的json字符串。
        • 重点4:
          • String nameStr = doc[0]["name"].as();
          • String websiteStr = doc[1]["website"].as();
          • 可以看见与前面不同的是 在数组里元素的解析结果要加上 数组地址 如 第一个元素就是地址为0的
      • 使用ArduinoJson官网在线工具解析JSON信息

         

         

         

         

         

         

         

        • ArduinoJson官网提供了在线工具可帮助我们自动生成JSON解析代码。该工具网址如下:
        • 利用 网站 解析JSON 代码
        • 如果版本不对就会出现一下问题
      • ESP8266闪存存储的JSON解析
        • 我们在开发物联网项目时,可能需要ESP8266解析比较大型的JSON信息。如果这些大型JSON信息存储再程序中,将会占用大量系统动态内存,严重的甚至会出现系统控制程序空间不足问题。因此,我们需要将大型JSON文件存储在ESP8266的闪存系统中。以下示例程序演示如何使用ESP8266读取并且解析存储在闪存中的JSON
        • 在测试以下示例程序前,请首先将以下zip文件下载并且解压缩。解压缩后您将会得到一个JSON文件,该文件含有ESP8266连接WiFi的信息。请根据您的WiFi环境进行相应调整再将文件上传到ESP8266的闪存根目录下。

           

          • 第一步 : 新建文件夹 包含代码和data数据文件夹
          • 第二步:打开json 文件 修改自己的WiFi名称 密码上传 代码
          • 第三部 编译上传代码 成功 通过 解析JSON 数据链接了网络

ESP8266客户端请求JSON信息

  • 由于易于解析且量级很轻,JSON成为了常用的物联网信息传输格式之一。在这一节里,我们将一起学习以下几个主要知识点:
    • 1. 使用ESP8266来建立物联网服务器,该服务器可以向客户端发送JSON格式响应信息从而实现物联网信息通讯。
    • 2. 使用ESP8266来通过网络向物联网服务器请求JSON信息
    • 3. 使用ESP8266来通过ArduinoJson库解析JSON信息
  • 在接下来的讲解中,我们将需要两块ESP8266-NodeMCU开发板。其中一块作为服务器,另一块作为客户端。如下图所示,客户端将会向服务器发送请求信息。服务器端在接收到客户端请求后,会将JSON信息加入服务器响应信息中发送给客户端。
  • 示例一 ESP8266客户端请求单一JSON数据信息
    • 服务器端程序
    • 服务器端程序主要功能:
      • 1. 实时读取A0、 D1、D2以及D3引脚的读数。
      • 2. 当有客户端请求时,通过响应信息将引脚读数和测试数据信息发送给客户端。
      • 信息发送格式为json格式。以下为该json信息的示例: JSON 数据解析 该JSON数据包含了3个对象,第一个对象是info 有三个名值对,第二个数据对象是 digital_pin包含的自然就是 三个引脚的状态,第三个对象只有analog_pin 对应的是a0引脚的信息。这些引脚的数据是实时更新的

      • 代码: 需要确保的是 服务器端和客户端需要在同一网络状态下

      • 代码讲解: 通过on函数 进行首页信息访问

        • on 函数之后是对
        • 通过字符串的叠加再服务器端形成json信息 其次是对相关数据的更新是一个重点 通过对数据进行string转换之后 通过字符串叠加的方式加到对应位置之后。
        • 服务器端 是通过响应体的形式发送到客户端 并且响应头 响应体之间是通过空行的形式进行分割的。
      • 以上程序的重点是函数rootJson。该函数作用是实时获取ESP8266开发板引脚信息并且建立JSON信息。该信息将会通过服务器响应信息发送给请求这一信息的客户端。此方法相对简单,但是缺点是不够灵活。假如我们需要修改响应的JSON信息,那么就要重新构建JSON字符串。另外,假如我们的响应JSON信息比较复杂,那么构建这个字符串的工作还是很麻烦的。接下来我们再以上程序的基础上做一下修改。
      • 改善:我们将使用ArduinoJson官网的在线工具来自动生成代码,搭建我们想要的JSON信息并应用到程序的rootJson函数中 也就是说当我们的JSON较为麻烦的时候就可以通过在线工具 解析然后将解析好的代码放入 rootJSON 函数里。

      • 编译上传

       

    • 客户端程序
      • 客户端程序的主要功能:
        • 1. 向服务器端请求json数据信息
        • 2. 解析服务器端响应的json信息内容。
        • 3. 将解析后的数据信息显示于串口监视器
        • 4. 利用服务器端D3引脚(按键引脚)读数来控制客户端开发板上LED的点亮和熄灭
      • 代码:

      • 代码讲解:
        • 客户端的请求信息

        • 通过 client.print(请求信息); 这个时候就是完成了一次请求
        • 获取响应状态行 信息 得到响应状态行之后就会知道已经完成了请求与响应 该函数就是通过从相应信息的头部开始读取读到\n之后就将之前的信息存到一个字符串里。 获取响应状态行是非常关键 非常关键的
        • 通过find 函数跳过响应头部直接得到响应体 就是通过跳过响应状态行与 空行进行判断跳过

        • 对服务器的响应信息JSON进行解析

         

      • 编译上传 成功后

    • 当我们按下服务器端按键之后 可以看见客户端的led灯亮起来 也可以看见此io口的状态改变

    • 以上程序中最重点的部分是函数httpRequest。该函数向服务器发送HTTP请求,并且对服务器相应的JSON信息进行了解析。解析后的数据信息将通过串口监视器显示,其中服务器按键引脚的状态信息还被用于控制客户端板上的LED点亮和熄灭。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值