关于Json这种数据格式,在前面已经做了详细的介绍 ,在项目开发过程中我们需要针对不同的语言使用不同的库对Json格式的数据进行解析,下面给大家介绍一个基于C语言的Json库 – 。cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的JSON解析器。
cJSON 是一个开源项目,github下载地址:https://github.com/DaveGamble/cJSON
在中定义了一个非常重要的结构体,想要熟悉使用库函数可从结构体入手,结构体如下所示:
关于这个结构体做如下几点的说明:
- 结构体是一个双向链表,并且可通过指针访问下一层。
- 结构体成员变量用于描述数据元素的类型(如果是键值对表示值的类型),数据元素可以是字符串可以是整形,也可以是浮点型。
- 如果是整形值的话可通过将值取出
- 如果是浮点型的话可通过将值取出
- 如果是字符串类型的话可通过将值取出
- 结构体成员表示键值对中键值的名称。
作为格式的解析库,其主要功能就是构建和解析格式了,比如要发送数据:用途就是发送端将要发送的数据以形式封装,然后发送,接收端收到此数据后,还是按形式解析,就得到想要的数据了。
格式的数据无外乎有两种和,创建的Json数据串可能是二者中 的一种,也可能是二者的组合,不管哪一种通过调用相关的API函数都可以轻松的做到这一点。
在头文件中可以看到一些函数声明,通过调用这些创建函数就可以将Json支持的数据类型封装为结构体类型:
另外,cJson库中还给我我们提供了一些更为简便的操作函数,在创建数组的同时还可以进行初始化
当得到一个Json对象之后,就可以往对象中添加键值对了,可以使用
在库中节点的从属关系是通过树来维护的,每一层节点都是通过链表来维护的,这样就能分析出该函数参数的含义:
- object:要添加的键值对从属于那个节点
- string:添加的键值对的键值
- item:添加的键值对的value值(需要先将其封装为cJSON类型的结构体)
为了让我的操作更加方便,cJson库还给我们提供了一些宏函数,方便我们快速的往Json对象中添加键值对
我们还可以根据Json对象中的键值取出相应的value值,API函数原型如下:
添加数据到Json数组中(原始数据需要先转换为结构体类型)
得到Json数组中元素的个数:
得到Json数组中指定位置的原素,如果返回表示取值失败了。
序列化就是将Json格式的数据转换为字符串的过程,cJson库中给我们提供了3个转换函数,具体如下:
第一个参数表示Json数据块的根节点。
- 调用函数我们可以得到一个带格式的Json字符串(有换行,看起来更直观)
- 调用函数会得到一个没有格式的Json字符串(没有换行,所有的数据都在同一行)。
- 调用函数使用缓冲策略将Json实体转换为字符串,参数是指定缓冲区的大小,参数表示未格式化,表示格式化。
我们在编码过程中可以根据自己的实际需求调用相关的操作函数得到对应格式的Json字符串。
如果我们得到了一个Json格式的字符串,想要读出里边的数据,就需要对这个字符串进行解析,处理方式就是将字符串转换为结构体,然后再基于这个结构体读里边的原始数据,转换函数的函数原型如下:
当我们将数据封装为结构类型的节点之后都会得到一块堆内存,当我们释放某个节点的时候可以调用cJson库提供的删除函数,函数原型如下:
该函数的参数为要释放的节点的地址,在此强调一点:
创建一个对象,并向这个对象里添加字符串和整型键值:
运行结果
若干说明:
- 函数可创建一个根对象,返回的是一个 指针,在这个指针用完了以后,需要手动调用 进行内存回收。
- 函数内部封装了函数,所以需要使用函数释放被占用的内存空间。
创建一个数组,并向数组添加一个字符串和一个数字
运行结果:
对象里面包括一个数组,数组里面包括对象,对象里面再添加一个字符串和一个数字
示例代码:
运行结果:
Json字符串的解析流程和数据的封装流程相反,假设我们有这样一个Json字符串(字符串中的双引号需要通过转义字符将其转译为普通字符):
示例代码如下:
输出的结果:
加大一点难度,下面我们解析一个嵌套的Json对象,数据如下:
打印结果:
如果我们遇到的Json字符串是一个Json数组格式,处理方式和Json对象差不多,比如我们要解析如下字符串:
对于Json字符串最复杂的个数莫过于Json对象和Json数组嵌套的形式,下面通过一个例子演示一下应该如何解析,字符串格式如下:
在解析的时候,我们只需要按照从属关系,一层层解析即可:
- 根节点是一个Json对象,基于根节点中的key值取出对应的value值,得到一个Json数组
- 读出Json数组的大小,遍历里边的各个元素,每个元素都是一个Json对象
- 将Json对象中的键值对根据key值取出对应的value值
- 从取出的Value值中读出实际类型对应的数值
示例代码如下:
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/13173.html