#夏日挑战赛#【FFH】啃论文俱乐部---cJSON在传统C/S模型的应用 原创 精华
本文正在参加星光计划3.0–夏日挑战赛
大家好! 我是深圳技术大学FSR实验室
的同学,在OpenHarmony成长计划啃论文俱乐部
里,与华为、软通动力、润和软件、拓维信息、深开鸿
等公司一起,学习和研究序列化相关技术
…
@TOC
【简单回顾】
①【FFH】OpenHarmony啃论文成长计划—为什么JSON将逐渐取代XML?
②【FFH】OpenHarmony啃论文成长计划—几种常见的JSON解析器比较
③【FFH】OpenHarmony啃论文成长计划—JSON-RPC
④【FFH】OpenHarmony啃论文成长计划—浅谈序列化规范
⑤【FFH】OpenHarmony啃论文成长计划—Flatbuffers应用于MQTT协议
⑥【FFH】OpenHarmony啃论文成长计划—序列化技术发展及应用综述
⑦【FFH】OpenHarmony啃论文成长计划—Apache Avro与Twiste
【本期看点】
大家好,回顾前面几篇文章,我们看的那些都是整个JSON领域的内容,这次我们来看点跟OpenHarmony相关的。本次的内容让我们来探索一下OpenHarmony系统源码用的什么JSON解析库。
- 如何寻找OpenHarmony引用的第三方开源库
- 文献场景综述
- cJSON结构体分析
- cJSON在传统C/S模型下的应用
如何寻找OpenHarmony引用的第三方开源库
开始之前,我们先来看看如何寻找OpenHarmony引用的第三方开源库。
其实非常简单,只需要在Gitee上全局搜索OpenHarmony third party
+相关领域关键术语
,比如我想看看OpenHarmony用的跟JSON相关的库,那就是全局搜索OpenHarmony third party json
字段。
然后我们就可以看到我们的搜索结果啦,如下,我们本次要讨论的就是cJSON这个C语言的开源JSON解析库。
文献场景综述
cJSON是一个用在底层数据通信的一个C语言的JSON数据解析库。比如在一个系统底层使用socket方式进行通信的时候,通信两端就可以用cJSON对传递的JSON数据对象进行处理,下面我们来看看一篇关于cJSON在传统C/S(Client/Server)模型的应用。
cJSON github 开源地址如下:
https://github.com/DaveGamble/cJSON
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在传统C/S模型下的应用
如图,cJSON库里面有很多函数方法,可以进行一系列创建以及处理JSON对象的操作。
下面我们来看看传统的client端到server端通过cJSON进行数据交换处理的具体过程。
数据打包过程
数据包在上传到服务器之前需要封装成JSON格式,然后通过网络传输。因此,需要创建一个cJSON类型的对象,然后调用cJSON_AddStringToObject()函数,向对象添加信息的属性值,此时通过调用 cJSON_Print()的函数将对象的属性解析到缓存中,这里可以认为将cJSON对象序列化为字符串,所以实际上,缓存中存储了一个字符串。此时,可以根据Ascii代码表将缓存的Ascii值顺序转换为十六进制数。最后,将十六进制数发送到服务器后,至此打包工作完成。
解析数据包过程
· 同样,在服务器将信息发送给客户端后,需要根据协议的格式对数据包进行适当的分析。因此,此时调用cJSON_Parse()函数来解析来自服务器的JSON数据包,此外,还需要创建cJSON的对象来接收解析后的数据,最后,使用JSON_GetObjectItem()的函数来获取cJSON对象的不同属性值,这样就完成了数据包的解包工作。需要注意的是,在处理数据后,必须调用cJSON_Delete()函数来释放创建的对象。否则会导致内存泄漏,并导致系统不稳定。
文末
这个我们简单得对OpenHarmony应用的这个第三方开源库cJSON进行了场景应用分析以及简单的源码分析。
下篇文章我们来横向对比一下其他开源C/C++ JSON解析库。
楼主文中分享的Gitee上全局搜索的方法很实用,之前在Gitee老找不到想要的东西。
这个比较好玩