*基于C语言的json数据映射解析库CSON

举报
秦玉安 发表于 2021/09/30 13:28:43 2021/09/30
【摘要】 基于C语言的json数据映射解析库CSON基于C语言的json数据映射解析库CSON摘要:1:模型解析工具CSON2:打开KEIL,新建工程3:添加CSON文件到工程并编译4:具体实例应用4.1:声明结构体4.2:定义数据模型4.3:使用CSON来进行解析JSON格式摘要: 在物联网通讯中,由于经常要跟网络服务数据通讯,在这个过程里面,必须理解JSON格式,JSON(JavaScript O...

基于C语言的json数据映射解析库CSON

摘要:

在物联网通讯中,由于经常要跟网络服务数据通讯,在这个过程里面,必须理解JSON格式,JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。我们把数据JSON封装好之后去做,然后再上传,同时,我们通过上位机或者web进行下发控制的时候,也是以JSON格式来处理,下面讲下基于C语言的json数据映射解析库CSON。在STM32F1最小系统板上来实现处理。

1:模型解析工具CSON

cJSON,运行于C语言平台的json-struct的解析库,这个解析库在github上有开源,地址为:

https://github.com/NevermindZZT/cson

2:打开KEIL,新建工程

image-20210930090743298

3:添加CSON文件到工程并编译

image-20210930091027531

将github上下载的两个文件添加到keil工程里面。

image-20210930091506619

然后编译,查看编译结果。

image-20210930091530510

4:具体实例应用

引用GIthub上作者原话, CSON是一个简单的cJSON的二次封装,相比于使用原生cJSON一层一层解析的方式,CSON采用模型映射的方式,使用模型将结构体的特征进行描述,然后根据模型,将json数据直接解析成结构体,免去使用原生cJSON需要多次调用API的复杂性,可以很大程度减少代码冗余,增加代码逻辑性。所以你会在工程里面看到CJSON文件,下面进行实际操作下。

4.1:声明结构体

 /** 项目结构体 */
 struct project
 {
     int id;
     char *name;
 };
 /** 仓库结构体 */
 struct hub
 {
     int id;
     char *user;
     struct project *cson;
 };


4.2:定义数据模型

 /** 项目结构体数据模型 */
 CsonModel projectModel[] =
 {
     CSON_MODEL_OBJ(struct project),
     CSON_MODEL_INT(struct project, id),
     CSON_MODEL_STRING(struct project, name),
 };
 ​
 /** 仓库结构体数据模型 */
 CsonModel hubModel[] =
 {
     CSON_MODEL_OBJ(struct hub),
     CSON_MODEL_INT(struct hub, id),
     CSON_MODEL_STRING(struct hub, user),
     CSON_MODEL_STRUCT(struct hub, cson, projectModel, sizeof(projectModel)/sizeof(CsonModel))
 };
 ​

4.3:使用CSON来进行解析JSON格式


 {
   "id": 1,
   "user": "Letter",
   "cson": {
     "id": 2,
     "name": "cson"
   }
 }


 ​
 void csonDemo(void)
 {
     char *jsonDemo = "{\"id\": 1, \"user\": \"Letter\", \"cson\": {\"id\": 2, \"name\": \"cson\"}}";
 ​
     /** 解析json */
     struct hub *pHub = csonDecode(jsonDemo, hubModel, sizeof(hubModel)/sizeof(CsonModel));
     printf("hub: id: %d, user: %s, project id: %d, project name: %s\r\n",
         pHub->id, pHub->user, pHub->cson->id, pHub->cson->name);
     /** 释放结构体对象 */
     csonFree(pHub, hubModel, sizeof(hubModel)/sizeof(CsonModel));
 ​
 }

在函数调用之前,还需要进行初始

     csonInit(*malloc,*free);

查看串口调试助手信息:

image-20210930112914893

json格式已经解析,这个模块的功能还有很多,也可以编码结构体,将结构体对象序列化成json字符串,大家可以自己去实现处理。是不是很方便,大家可以具体去实现!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。