#夏日挑战赛#【FFH】啃论文俱乐部---cJSON在传统C/S模型的应用 原创 精华

Hagon
发布于 2022-7-18 22:23
浏览
1收藏

本文正在参加星光计划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字段。

#夏日挑战赛#【FFH】啃论文俱乐部---cJSON在传统C/S模型的应用-鸿蒙开发者社区

​ 然后我们就可以看到我们的搜索结果啦,如下,我们本次要讨论的就是cJSON这个C语言的开源JSON解析库。

#夏日挑战赛#【FFH】啃论文俱乐部---cJSON在传统C/S模型的应用-鸿蒙开发者社区

文献场景综述

​ 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模型下的应用

#夏日挑战赛#【FFH】啃论文俱乐部---cJSON在传统C/S模型的应用-鸿蒙开发者社区

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

下面我们来看看传统的client端到server端通过cJSON进行数据交换处理的具体过程。

数据打包过程

#夏日挑战赛#【FFH】啃论文俱乐部---cJSON在传统C/S模型的应用-鸿蒙开发者社区

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

解析数据包过程

#夏日挑战赛#【FFH】啃论文俱乐部---cJSON在传统C/S模型的应用-鸿蒙开发者社区

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

文末

​ 这个我们简单得对OpenHarmony应用的这个第三方开源库cJSON进行了场景应用分析以及简单的源码分析。

​ 下篇文章我们来横向对比一下其他开源C/C++ JSON解析库。

参考文献

A method of cross-platform network data exchange

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
iccps.2016.7751091.pdf 520.62K 23次下载
已于2022-7-18 22:50:33修改
7
收藏 1
回复
举报
2条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

楼主文中分享的Gitee上全局搜索的方法很实用,之前在Gitee老找不到想要的东西。

回复
2022-7-19 10:09:57
seiichi123
seiichi123

这个比较好玩

回复
2022-7-29 10:52:26
回复
    相关推荐