cJSON 在传统 C/S 模型的应用

cJSON 在传统 C/S 模型的应用

文章转发自51CTO 开源基础软件社区 OpenHarmony成长计划啃论文俱乐部【FFH】啃论文俱乐部—JSON压缩算法解读

1. 关于作者

大家好!我是来自深圳技术大学FSR Lab(编者注:Falcon Swarm Robotics Lab猎鹰集群机器人控制实验室的缩写)的同学HagonChan,陈汉武,标题FFH就是FSRlab For Harmony!并且我也正在参加OpenHarmony成长计划从论文到开源提交研究,以后我们也会陆续在这个社区记录学习心得和体会。

在OpenHarmony成长计划啃论文俱乐部里,FFH小组同学们与华为、软通动力、润和软件、拓维信息、深开鸿等公司一起,学习和研究序列化相关技术…

2. 前言

cJSON是一个用在底层数据通信的一个C语言的JSON数据解析库。比如在一个系统底层使用socket方式进行通信的时候,通信两端就可以用cJSON对传递的JSON数据对象进行处理,下面我们来看看一篇关于cJSON在传统C/S(Client/Server)模型的应用。
cJSON github 开源地址如下:https://github.com/DaveGamble/cJSON

3. cJSON结构体分析

我们来看看cJSON的源码的结构体部分:


/* The cJSON structure: */
typedef struct cJSON
{
    struct cJSON *next;
    struct cJSON *prev;
    struct cJSON *child;
    int type;
    char *valuestring;
    int valueint;
    double valuedouble;
    char *string;
} cJSON;
  • *next/*prev:指向下一条/上一条键值对(key-value)节点。
  • type:表示该键值对节点中值的数据类型。
  • *valuestring/valueint/valuedouble:如果type为字符串/整型/浮点数类型,则其指向该键值。
  • *string:用于存储所有键(key)的名称,包括child中的key。
  • *child:当值类型为复杂数据结构,如数组,对象,嵌套JSON等等,则该指针指向该键值。

可以看到cJSON是通过链表来存储JSON数据的,这个设计比较巧妙,相较于JSONcpp,cJSON可以保证写入的数据和输出的数据的顺序保持一致,而JSONcpp则不能保证写入和输出的顺序一致性,因为在存储的时候JSONcpp会按照key-value进行内部排序。所以对于一些要求JSON数据顺序的业务,cJSON相对于JSONcpp就是一个更好的选择。

通过这个数据结构我们也可以知道每一个JSON对象里面的键值对都通过next和prev指针链接相邻的键值对节点,以保证我们刚刚说的数据顺序。

从这个数据结构我们还能看到另外一个巧妙地地方,就是*child指针,这个指针让这个cJSON支持复杂数据结构,比如数组,对象,嵌套JSON数据对象等。

cJSON的主要功能接口

功能接口特性
cJSON_CreateObject()生成一个JSON类型的对象
cJSON_AddStringToObject()给JSON对象添加结构属性
cJSON_GetObjectItem()获取JSON对象每个属性的值
cJSON_Print()将JSON对象的属性解析到缓存中
cJSON_Parse()字符串被解析为JSON对象
cJSON_Delete()释放创建的JSON对象

如上表,cJSON库里面有很多函数方法,可以进行一系列创建以及处理JSON对象的操作。

4. 数据打包过程

数据包在上传到服务器之前需要封装成JSON格式,然后通过网络传输。因此,需要创建一个cJSON类型的对象,然后调用cJSON_AddStringToObject()函数,向对象添加信息的属性值,此时通过调用 cJSON_Print()的函数将对象的属性解析到缓存中,这里可以认为将cJSON对象序列化为字符串,所以实际上,缓存中存储了一个字符串。此时,可以根据Ascii代码表将缓存的Ascii值顺序转换为十六进制数。最后,将十六进制数发送到服务器后,至此打包工作完成。

5. 解析数据包过程

同样,在服务器将信息发送给客户端后,需要根据协议的格式对数据包进行适当的分析。因此,此时调用cJSON_Parse()函数来解析来自服务器的JSON数据包,此外,还需要创建cJSON的对象来接收解析后的数据,最后,使用JSON_GetObjectItem()的函数来获取cJSON对象的不同属性值,这样就完成了数据包的解包工作。需要注意的是,在处理数据后,必须调用cJSON_Delete()函数来释放创建的对象。否则会导致内存泄漏,并导致系统不稳定。

6. 代码库位置

大家是不是跃跃欲试,想看代码?

如果希望寻找OpenHarmony引用的第三方开源库,只需要在Gitee上全局搜索OpenHarmony third party+相关领域关键术语。

OpenHarmony跟JSON相关的库,就是全局搜索OpenHarmony third party json字段。

写在最后

OpenHarmony 成长计划—“啃论文俱乐部”(以下简称“啃论文俱乐部”)是在 2022年 1 月 11 日的一次日常活动中诞生的。截至 3 月 31 日,啃论文俱乐部已有 87 名师生和企业导师参与,目前共有十二个技术方向并行探索,每个方向都有专业的技术老师带领同学们通过啃综述论文制定技术地图,按“降龙十八掌”的学习方法编排技术开发内容,并通过专业推广培养高校开发者成为软件技术学术级人才。

啃论文俱乐部的宗旨是希望同学们在开源活动中得到软件技术能力提升、得到技术写作能力提升、得到讲解技术能力提升。大学一年级新生〇门槛参与,已有俱乐部来自多所高校的大一同学写出高居榜首的技术文章。

如今,搜索“啃论文”,人们不禁想到、而且看到的都是我们——OpenHarmony 成长计划—“啃论文俱乐部”的产出。

OpenHarmony开源与开发者成长计划—“啃论文俱乐部”学习资料合集

1)入门资料:啃论文可以有怎样的体验  

https://docs.qq.com/slide/DY0RXWElBTVlHaXhi?u=4e311e072cbf4f93968e09c44294987d

2)操作办法:怎么从啃论文到开源提交以及深度技术文章输出https://docs.qq.com/slide/DY05kbGtsYVFmcUhU  

3)企业/学校/老师/学生为什么要参与 & 啃论文俱乐部的运营办法https://docs.qq.com/slide/DY2JkS2ZEb2FWckhq

 4)往期啃论文俱乐部同学分享会精彩回顾: 

同学分享会No1.成长计划啃论文分享会纪要(2022/02/18)  https://docs.qq.com/doc/DY2RZZmVNU2hTQlFY  

同学分享会No.2 成长计划啃论文分享会纪要(2022/03/11)  https://docs.qq.com/doc/DUkJ5c2NRd2FRZkhF  

同学们分享会No.3 成长计划啃论文分享会纪要(2022/03/25) 

https://docs.qq.com/doc/DUm5pUEF3ck1VcG92?u=4e311e072cbf4f93968e09c44294987d

现在,你是不是也热血沸腾,摩拳擦掌地准备加入这个俱乐部呢?当然欢迎啦!啃论文俱乐部向任何对开源技术感兴趣的大学生开发者敞开大门。

扫码添加 OpenHarmony 高校小助手,加入“啃论文俱乐部”微信群

后续,我们会在服务中心公众号陆续分享一些 OpenHarmony 开源与开发者成长计划—“啃论文俱乐部”学习心得体会和总结资料。记得呼朋引伴来看哦。