【FFH】OpenHarmony啃论文成长计划---cJSON在传统C/S模型下的应用

【简单回顾】

【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字段。

image.png

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

image.png

文献场景综述

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

image.png

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

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

数据打包过程

image.png

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

解析数据包过程

image.png

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

文末

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

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

参考文献

A method of cross-platform network data exchange

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值