1.1 cJSON的核心数据结构
1.1 cJSON的核心数据结构
在我们进一步学习cJSON之前,我们需要知道cJSON中的一个核心数据结构---->cJSON,让我们看看在cJSON.h中的定义:
2 typedef struct cJSON 3 { 5 struct cJSON *next;//cJSON结点的下一个结点的位置指针 6 struct cJSON *prev;//cJSON结点的上一个结点的位置指针 8 struct cJSON *child;//若当前cJSON是一个cJSON的对象或者是一个数组类型,即类似于cJSON字段中的字段值还是一个子cJSON字段,那么就是这个child结点非空 9 11 int type;//cJSON结点的数据的类型 12 14 char *valuestring;//字符串的数据值(这个数据值需要根据数据类型type匹配之后才能访问) 16 int valueint;//整形的数据值(这个数据值需要根据数据类型type匹配之后才能访问) 18 double valuedouble;//浮点数类型(这个同样需要type为Number类型才能访问) 19 21 char *string;//这个结点的key值(我们知道JSON都有一个key,这个key是字符串,而这个字段就是访问键的名称的) 22 } cJSON;
实际上,我们以一个我构想的JSON串举例来理解一下cJSON存储JSON结点的原理,如下:
{'Name':'XiaoXin','Age':23,'Info':{'Year':2026,'Month':11}}
实际上这个JSON串,你可以想象为就是一个由多个cJSON结点通过next和prev指针连接起来的双向链表以及一个树的结构(这个树的结构也就是我们里面的那个child结点,这个结点就是用来存储当JSON对象的值还是JSON对象的),这也是cJSON库设计的精髓所在,然后cJSON的相关操作函数都是用来对这个双向链表的插入和删除以及访问操作。以及对内部当当前结点是一个子JSON对象或数组类型的时候对其进行遍历的相关操作函数。我们都知道JSON不仅仅是单一的扁平的链式结构。而在大多数场景中还是一个树形的层级结构。我们上面那个JSON串,里面的Name,Age两个JSON结点实际上他们就是扁平的链式结构存储的。然后Info结点本身是一个child类型,也是cJSON内部所谓的Object类型。这个完全无法实用单一的双向链表结构来存储。而需要抽象为child结点,在child结点的基础上再创建一个链式结构来存储里面的Year和Month字段。所以其实cJSON内部的存储方式从逻辑上来说,它就是一个链表和树交叉构成的一个多叉树的结构。理解这一点,这对我们后续学习cJSON的相关操作函数尤其的重要。实际上我们上面那个JSON串在cJSON库里是这样子存储的:
1 【Root根节点】(Type: Object, string: NULL) 2 ├─ child → 指向第一个子节点:"XiaoXin" 节点 3 │ 4 ├─ 第一层子链表(根的所有直接子节点,通过 next/prev 双向链接) 5 │ ┌─────────────────────────────────────────────────────────┐ 6 │ ↓ ↓ 7 │ ┌──────────────┐ next ┌──────────┐ next ┌──────────┐ 8 │ │ "Name" 节点 │ ───────→ │ "Age"节点 │ ───────→ │ "Info"节点│ 9 │ │ (String类型) │ ←─────── │ (Number) │ ←─────── │ (Object) │ 10 │ │ val:XiaoXin │ prev │ val:23 │ prev │ 非空child│ 11 │ └──────────────┘ └──────────┘ └──────────┘ 12 │ ↑ 13 │ │ child 14 └─────────────────────────────────────────────────────────┘ 15 │ 16 ┌────────────────┐ 17 │ 第二层子链表 │ 18 │ (Info的子节点) │ 19 └────────────────┘ 20 ↓ 21 ┌──────────────┐ next ┌───────────┐ 22 │ "Year" 节点 │ ───────→ │ "Month"节点│ 23 │ (Number类型) │ ←─────── │ (Number) │ 24 │ val:2026 │ prev │ val:11 │ 25 └──────────────┘ └───────────┘

浙公网安备 33010602011771号