cJSON库使用小结

JSON(JavaScript Object Notation)[1]是一种轻量级的数据交换格式。它采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
引用:
[1]
百度百科词条“JSON”: https://baike.baidu.com/item/JSON/2462549?fr=aladdin

1.JSON

我们知道,JSON主要构建于两种结构:一种是“名称/值”对的集合,我们一般称之为对象(object),比如,

另一种是值的有序列表(An ordered list of values),我们一般称之为数组(array),比如,

实际工作中我们用到的JSON串一般会同时包含上述两种结构,并且还可能会彼此嵌套。

2.cJSON

虽然JSON起源于JavaScript语言,但如今许多编程语言都提供了生成和解析JSON格式数据的接口。本文主要介绍cJSON库的一般使用方法。

(1)搭建cJSON

由于cJSON库主要是由一个c文件和一个头文件构成,因此你可以直接将这两个文件复制到任何你需要的地方,只是在编译的时候需要注意包含头文件的路径即可(使用-I选项指定头文件路径)。

此外,还有一种方法:将cJSON库下载到你的linux中,然后使用cmake及make将相应的头文件及库文件安装到诸如/usr/include/等目录下,命令如下:

至此,在项目中包含头文件:#include <cjson/cJSON.h>后就可使用cJSON库了。

(2)cJSON数据结构

cJSON数据结构如下所示:

其中,第四个字段:int type;表示此JSON条目的类型。但是,该类型字段是以位标志(bit-flag)的形式存储的,这就意味着仅通过比较type的值是无法判断该条目具体是什么类型的。

所以,针对如下条目类型,cJSON提供了形如cJSON_Is…的函数来判断条目的具体类型:

(3)使用cJSON

对每一种值类型来说,cJSON都提供了相应的形如cJSON_Create…()函数来创建它们。这些函数会分配一个cJSON结构体,相应地需要使用cJSON_Delete()函数来释放cJSON结构体所占用的空间。

对null, booleans, numbers以及strings这些基本类型,相应地有创建函数:

对数组(array)类型而言,

需要注意的是:因为cJSON中的数组的底层是通过链表实现的,所以通过索引来遍历数组的话效率会很低(O(n^2)),因此cJSON提供了宏cJSON_ArrayForEach可以实现时间复杂度为O(n)的遍历数组。

类似地,对于对象(objects)类型而言,

(4)解析JSON

使用cJSON_Parse()函数可以解析以0结尾的JSON字符串。

(5)打印JSON

cJSON库提供了如下打印JSON至字符串的函数:

3.示例

(1)组装JSON

使用上述介绍的cJSON API,组装如下所示的JSON串:

createJSON.c代码如下:

编译、运行:

(2)解析JSON

如下示例解析JSON串,并判断是否存在{“width”: 1920, “height”: 1080}的子条目,parseJSON.c代码如下:

编译、运行:

4.其他

本文主要介绍、总结了cJSON的一般使用方法,如需深入学习请参考文末所列的参考文献。转载请注明出处。

 

参考:
[1]百度百科词条“JSON”: https://baike.baidu.com/item/JSON/2462549?fr=aladdin
[2]http://www.json.org/json-zh.html
[3]https://en.wikipedia.org/wiki/JSON
[4] https://github.com/DaveGamble/cJSON

《cJSON库使用小结》有1个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注