Keil环境下STM32工程加入cJSON

背景知识   
 
 

什么是JSON?

  • JSON 指的是 JavaScript 对象表示法( J ava S cript  O bject  N otation)
  • 是轻量级的文本数据交换格式,JSON 比 XML 更小、更快,更易解析。
 
 

JSON 语法规则

JSON 语法是 JavaScript 对象表示语法的子集。
  • 数据在名称/值对中
  • 数据由逗号分隔
  • 大括号保存对象
  • 中括号保存数组
JSON 值能够是: 字符串, 数字, 对象, 数组, 布尔值 或 null 
 
JSON是一种轻量级的数据交换格式,这里不作详细的分析,简单的理解为,是互联网上的一种数据打包协议,比较方便人阅读和编写,下面是阿里云物联网精简物模型信息的json格式,以下所示:
 
精简物模型:
物模型是对设备在云端的功能描述,包括设备的属性、服务和事件。物联网平台经过定义一种物的描述语言来描述物模型,称之为 TSL (即Thing Specification Language),采用JSON格式,您能够根据TSL组装上报设备的数据。您能够导出完整物模型,用于云端应用开发;您也能够只导出精简物模型,配合设备端SDK实现设备开发。
{
  "properties": [
    {
      "identifier": "WaterConsumption",
      "dataType": {
        "type": "float"
      }
    },
    {
      "identifier": "ValveSwitch",
      "dataType": {
        "type": "enum"
      }
    }
  ]
}

 

 
   若是仔细看,其实各个数据关系仍是比较明显的。在json中,一切都是对象(object),所以任何支持的数据类型,都是能够经过JSON来表示的,例如字符串、数字、对象、数组。JSON本质是一个字符串,而json的对象则是其中的元素。
 
    从上面的分析,咱们能够知道,对于json的解析,简单的讲就是从一堆字符串中,筛选出本身须要的信息。这个听起来很简单,真正实现起来却不是那么简单,由于字符串筛选功能自己就很难,再加上其中的对象排列顺序可能不一样,中间有没有空格,数值是整数、仍是浮点数,是正数,仍是负数,这些都是很麻烦的,若是咱们的数据格式是固定的还好,可是稍微有一点变更,就会很麻烦,因此写出一个兼容性很强的json解析程序, 仍是比较难的,而cJSON就是一个专门用来解析JSON字符串的,由于简洁又简单,效率还快,移植也特别方便,只须要一个cJSON.c和cJSON.h文件。
  •  
 
STM32 cJSON移植步骤:
 
一、下载JSON文件:
 
 
 
等到倒计时到0便可下载:
 
 
 

二、拷贝整个cJSON源文件到工程的根目录下:

 
 
 
三、添加cJSON文件夹至Include Paths:
 
 
 
四、添加cJSON.c文件夹至工程中:
 
 
 
添加完毕以后,工程目录显示格式:
 
 
五、修改源代码
 
由于我用的是正点原子的STM32 工程文件作测试,他们有本身定义的malloc.c、malloc.h,
咱们把本来的cJSON中的malloc 和free替换成咱们本身的,以下代码:
 
 
 
更改成:
 
 
 
六、应用实例
(1)、main.c文件中添加引用头文件
#include "cJSON.h"

 

 
(2)、编写测试代码 main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "string.h"  
#include <stdio.h>
#include "cJSON.h"

void ParseStrDemo(void)
{
    char strArr[] = "{\"name\":\"Andy\",\"age\":20}";
    cJSON *str_json, *str_name, *str_age;
    
    printf("strArr[]:%s \r\n",strArr);
    
    str_json = cJSON_Parse(strArr);   //建立JSON解析对象,返回JSON格式是否正确
    if (!str_json)
    {
        printf("JSON格式错误:%s \r\n", cJSON_GetErrorPtr()); //输出json格式错误信息
    }
    else
    {
        printf("JSON格式正确:\n%s \r\n",cJSON_Print(str_json) );
        str_name = cJSON_GetObjectItem(str_json, "name"); //获取name键对应的值的信息
        if (str_name->type == cJSON_String)
        {
            printf("姓名:%s \r\n", str_name->valuestring);
        }
        str_age = cJSON_GetObjectItem(str_json, "age");   //获取age键对应的值的信息
        if(str_age->type==cJSON_Number)
        {
            printf("年龄:%d \r\n", str_age->valueint);
        }
        cJSON_Delete(str_json);    //释放内存
    }
}

int main(void)
{
    while(1)
    {
        ParseStrDemo();
        
        delay_ms(1000);
    }    
}

 

 
(3)、测试结果
 
 
 
七、JSON应用的地方
  • IoT云端下行的payload数据包解析
  • 自定义JSON格式通信协议
  • 设备间参数传递
  • API接口返回值,好比大部分天气API
  • 网络数据传输
 
八、在线JSON校验格式化工具
 
该网址能够压缩JSON字符串,校验JSON字符串是否合法。

喜欢请关注微信公众号:程序员小哈程序员

 

若以为本次分享的文章对您有帮助,随手点赞、收藏或转发分享,也是对个人支持。json

欢迎评论中讨论,你们一块儿提升。数组

 

从六月份开始,每月会制做一个毕业设计难度的DIY做品,微信

前期做品以模块组合的形式搭建,下降门槛,方便你们一块儿跟着作;网络

DIY过程只在微信公众号中分享,你们没关注的,赶忙关注哈。ide

 

每月时间大体安排:工具

  • 上个月25号,公布DIY做品名称;测试

  • 每个月1日公布做品功能点及所须要的功能模块链接阿里云

  • 每个月10日前绘制完模块配合的线路板spa

  • 每个月15日以前硬件搭建完毕,以后按模块撰写代码,调试,随时公众号更新进展

  • 每个月月底开源整个做品的源码和PCB工程文件

 

题目选取原则:

  • 公众号每月20日发起投票,25日截止,票数最多的做为下个月的DIY内容;

  • 投票的备选项你们能够后台留言给我,我会选出五种留言最多的做为选项;

  • 每月的DIY内容尽可能与上个月分享的文章有必定的相关度,起到温故知新的做用。

 

有什么想法或者建议,后台留言给我哈