cjson读取json文件_Keil环境下STM32工程加入cJSON

本文介绍了在Keil环境下STM32工程中移植和使用cJSON库来解析JSON文件的步骤,包括下载cJSON源码、添加到工程、修改源代码以及应用实例。还提到了JSON在物联网、API接口等场景的应用,并推荐了一个在线JSON校验格式化工具。
摘要由CSDN通过智能技术生成

背景知识   

什么是JSON?

  • JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)

  • 是轻量级的文本数据交换格式,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移植步骤:

1、下载JSON文件:

链接:         https://sourceforge.net/projects/cjson/

45e606b2bb21433db89983fb056aca0f.png

等到倒计时到0即可下载:

e84cddb8e10be8c2cdf604f874e9d74f.png

2dda309ab2fb81894866ee2fa1cdc985.png

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

57abafef3a42e60cac72a0e0654611fb.png

4ba64ac29c1b51294663285f954f1c1b.png

3、添加cJSON文件夹至Include Paths:

55d15a59bd5813ae95b996a3e2b71172.png

4、添加cJSON.c文件夹至工程中:

b607e39f28867843077e664bb8c1d278.png

添加完毕之后,工程目录显示格式:

1eaabdbfa929902236d0676f53e66ad4.png

5、修改源代码

因为我用的是正点原子的STM32 工程文件做测试,他们有自己定义的malloc.c、malloc.h,

我们把原本的cJSON中的malloc 和free替换成我们自己的,如下代码:

6140deaf53f39e20c51adcfb5ebc570b.png

更改为:

96f7df715d37350fdfbf7c1ce3751b7a.png

6、应用实例

(1)、main.c文件中添加引用头文件

#include "cJSON.h"

(2)、编写测试代码 main.c

#include "sys.h"#include "delay.h"#include "usart.h"#include "string.h"  #include #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)、测试结果

f38f8f00efd77286736decc0f0b15e9f.png

7、JSON应用的地方

  • IoT云端下行的payload数据包解析

  • 自定义JSON格式通讯协议

  • 设备间参数传递

  • API接口返回值,比如大部分天气API

  • 网络数据传输

8、在线JSON校验格式化工具

http://www.bejson.com/

该网址可以压缩JSON字符串,校验JSON字符串是否合法。


喜欢请关注微信公众号:嵌入式从0到1

如果对您有所帮助,请帮忙转发一下呗

有啥想玩的模块,留言给我,咱们一起玩

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值