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

背景知识 什么是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/

eb60dc8cc10cfeb241ba1cdd2afa0407.png

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

d2e16b7cf938d0723a5afb68ef5c2d6d.png

bbc73c281192e1c6e3a9a615dad37a8a.png

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

25444f3ae123fadc58983ab0ea28cae3.png

90424723ee561767421a33c53aaf829a.png

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

271a38812ce583eeec3ea72c038dcf66.png

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

d4b8171d6e4f117b882c4c2abc30c7b6.png


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

7bd70b3003b3dfc34a31bf1ff0c80dc4.png

5、修改源代码
因为我用的是正点原子的STM32 工程文件做测试,他们有自己定义的malloc.c、malloc.h,
我们把原本的cJSON中的malloc 和free替换成我们自己的,如下代码:

b21e2c8bfee2e7fcab319ecb1eb4b7e6.png

更改为:

11921b5fd0bc5885e6c37044ef3039c9.png

6、应用实例
(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 rn",strArr);
 
    str_json = cJSON_Parse(strArr);   //创建JSON解析对象,返回JSON格式是否正确
    if (!str_json)
    {
        printf("JSON格式错误:%s rn", cJSON_GetErrorPtr()); //输出json格式错误信息
    }
    else
    {
        printf("JSON格式正确:n%s rn",cJSON_Print(str_json) );
        str_name = cJSON_GetObjectItem(str_json, "name"); //获取name键对应的值的信息
        if (str_name->type == cJSON_String)
        {
            printf("姓名:%s rn", str_name->valuestring);
        }
        str_age = cJSON_GetObjectItem(str_json, "age");   //获取age键对应的值的信息
        if(str_age->type==cJSON_Number)
        {
            printf("年龄:%d rn", str_age->valueint);
        }
        cJSON_Delete(str_json);    //释放内存
    }
}


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


(3)、测试结果

17c90911a577ed8fee9578e0e42eb7c5.png

7、JSON应用的地方

  • IoT云端下行的payload数据包解析
  • 自定义JSON格式通讯协议
  • 设备间参数传递
  • API接口返回值,比如大部分天气API
  • 网络数据传输

8、在线JSON校验格式化工具http://www.bejson.com/
该网址可以压缩JSON字符串,校验JSON字符串是否合法。


b537183daa06cbea58ff82d246aa579f.png


从六月份开始,每个月会制作一个毕业设计难度的DIY作品,
前期作品以模块组合的形式搭建,降低门槛,方便大家一起跟着做;DIY过程只在微信公众号中分享,大家没关注的,赶紧关注哈。

每个月时间大致安排:

  • 上个月25号,公布DIY作品名称;
  • 每月1日公布作品功能点及所需要的功能模块链接;
  • 每月10日前绘制完模块配合的线路板;
  • 每月15日之前硬件搭建完毕,之后按模块撰写代码,调试,随时公众号更新进展;
  • 每月月底开源整个作品的源码和PCB工程文件。

题目选取原则:

  • 公众号每个月20日发起投票,25号截止,票数最多的作为下个月的DIY内容;
  • 投票的备选项大家可以后台留言给我,我会选出五种留言最多的作为选项;
  • 每个月的DIY内容尽量与上个月分享的文章有一定的相关度,起到温故知新的作用。

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


喜欢请关注微信公众号:嵌入式从0到1
如果对您有所帮助,请帮忙转发一下呗
有啥想玩的模块,留言给我,咱们一起玩

64038a70e50fe13017c284c98d9bace2.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值