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/
等到倒计时到0即可下载:
2、拷贝整个cJSON源文件到工程的根目录下:
3、添加cJSON文件夹至Include Paths:
4、添加cJSON.c文件夹至工程中:
添加完毕之后,工程目录显示格式:
5、修改源代码
因为我用的是正点原子的STM32 工程文件做测试,他们有自己定义的malloc.c、malloc.h,
我们把原本的cJSON中的malloc 和free替换成我们自己的,如下代码:
更改为:
6、应用实例
(1)、main.c文件中添加引用头文件
(2)、编写测试代码 main.c
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)、测试结果
7、JSON应用的地方
IoT云端下行的payload数据包解析
自定义JSON格式通讯协议
设备间参数传递
API接口返回值,比如大部分天气API
网络数据传输
8、在线JSON校验格式化工具
http://www.bejson.com/
该网址可以压缩JSON字符串,校验JSON字符串是否合法。
喜欢请关注微信公众号:程序员小哈
如果对您有所帮助,请帮忙转发一下呗
有啥想玩的模块,留言给我,咱们一起玩
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!