看了cJSON的源码后,惊呼其设计之巧妙,其代码之简洁,其使用之方便!只有两个文件cJSON.h和cJSON.c,非常适合学习C语言中的链表。
JSON[1] 全称 JavaScript Object Notation,即 JS 对象简谱,是一种轻量级的数据格式。
它采用完全独立于编程语言的文本格式来存储和表示数据,语法简洁、层次结构清晰,易于人阅读和编写,同时也易于机器解析和生成,有效的提升了网络传输效率。
JSON 对象是一个无序的"名称/值"键值对的集合:
对于键值,可以有如下值:
示例如下:
cJSON 是一个使用 C 语言编写的 JSON 数据解析器,具有超轻便,可移植,单文件的特点,使用 MIT 开源协议。
cJSON 项目托管在 Github 上,仓库地址如下:
https://github.com/DaveGamble/cJSON
使用 Git 命令将其拉取到本地:
从 Github 拉取 cJSON 源码后,文件非常多,但是其中 cJSON 的源码文件只有两个:
使用的时候,只需要将这两个文件复制到工程目录,然后包含头文件即可,如下:
cJSON 的设计思想从其数据结构上就能反映出来。
cJSON 使用 cJSON 结构体来表示一个 JSON 数据,定义在中,源码如下:
cJSON 的设计很巧妙。
首先,它不是将一整段 JSON 数据抽象出来,而是将其中的一条 JSON 数据抽象出来,也就是一个键值对,用上面的结构体 来表示,其中用来存放值的成员列表如下:
其次,一段完整的 JSON 数据中由很多键值对组成,并且涉及到键值对的查找、删除、添加,所以使用链表来存储整段 JSON 数据,如上面的代码所示:
最后,因为 JSON 数据支持嵌套,所以一个键值对的值会是一个新的 JSON 数据对象(一条新的链表),也有可能是一个数组,方便起见,在 cJSON 中,数组也表示为一个数组对象,用链表存储,所以:
在键值对结构体中,当该键值对的值是一个嵌套的 JSON 数据或者一个数组时,由指针指向该条新链表。
封装 JSON 数据的过程,其实就是创建链表和向链表中添加节点的过程。
首先来讲述一下链表中的一些术语:
明白了这几个概念之后,我们开始讲述创建一段完整的 JSON 数据,即如何创建一条完整的链表。
上面讲述,一段完整的 JSON 数据就是一条长长的链表,那么,如何打印出这段 JSON 数据呢?
cJSON 提供了一个 API,可以将整条链表中存放的 JSON 信息输出到一个字符串中:
使用的时候,只需要接收该函数返回的指针地址即可。
单纯的讲述方法还不够,下面用一个例子来说明,封装出开头给出的那段 JSON 数据:
编译运行:
实验结果如图:
实验结果
该 JSON 数据链表的关系如图:
JSON关系图
参考资料
[1] JSON: https://www.json.org/
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/15146.html