什么是JSON?
- JSON 指的是 JavaScript 对象表示法( J ava S cript O bject N otation)
- 是轻量级的文本数据交换格式,JSON 比 XML 更小、更快,更易解析。
JSON 语法规则
JSON 语法是 JavaScript 对象表示语法的子集。- 数据在名称/值对中
- 数据由逗号分隔
- 大括号保存对象
- 中括号保存数组
{
"properties": [
{
"identifier": "WaterConsumption",
"dataType": {
"type": "float"
}
},
{
"identifier": "ValveSwitch",
"dataType": {
"type": "enum"
}
}
]
}
如果仔细看,其实各个数据关系还是比较明显的。在json中,一切都是对象(object),因此任何支持的数据类型,都是可以通过JSON来表示的,例如字符串、数字、对象、数组。JSON本质是一个字符串,而json的对象则是其中的元素。 从上面的分析,我们可以知道,对于json的解析,简单的讲就是从一堆字符串中,筛选出自己需要的信息。这个听起来很简单,真正实现起来却不是那么简单,因为字符串筛选功能本身就很难,再加上其中的对象排列顺序可能不同,中间有没有空格,数值是整数、还是浮点数,是正数,还是负数,这些都是很麻烦的,如果我们的数据格式是固定的还好,但是稍微有一点变动,就会很麻烦,所以写出一个兼容性很强的json解析程序, 还是比较难的,而cJSON就是一个专门用来解析JSON字符串的,因为简洁又简单,效率还快,移植也特别方便,只需要一个cJSON.c和cJSON.h文件。
2、拷贝整个cJSON源文件到工程的根目录下:
3、添加cJSON文件夹至Include Paths: 4、添加cJSON.c文件夹至工程中: 添加完毕之后,工程目录显示格式: 5、修改源代码 因为我用的是正点原子的STM32 工程文件做测试,他们有自己定义的malloc.c、malloc.h, 我们把原本的cJSON中的malloc 和free替换成我们自己的,如下代码: 更改为: 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 \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
- 网络数据传输
喜欢请关注微信公众号:程序员小哈
若觉得本次分享的文章对您有帮助,随手点赞、收藏或转发分享,也是对我的支持。
欢迎评论中讨论,大家一起提高。
从六月份开始,每个月会制作一个毕业设计难度的DIY作品,
前期作品以模块组合的形式搭建,降低门槛,方便大家一起跟着做;
DIY过程只在微信公众号中分享,大家没关注的,赶紧关注哈。
每个月时间大致安排:
-
上个月25号,公布DIY作品名称;
-
每月1日公布作品功能点及所需要的功能模块连接
-
每月10日前绘制完模块配合的线路板
-
每月15日之前硬件搭建完毕,之后按模块撰写代码,调试,随时公众号更新进展
-
每月月底开源整个作品的源码和PCB工程文件
题目选取原则:
-
公众号每个月20日发起投票,25日截止,票数最多的作为下个月的DIY内容;
-
投票的备选项大家可以后台留言给我,我会选出五种留言最多的作为选项;
-
每个月的DIY内容尽量与上个月分享的文章有一定的相关度,起到温故知新的作用。
有什么想法或者建议,后台留言给我哈