有了内存管理,我们就可以得到一些列不同类型的节点了。
然后我们通过节点操作就可以把这些节点连接起来,组成一棵树。
是的,所有的json 都可以理解为一颗有根树。
而节点操作有把加点 a 添加为节点 b 的儿子, 把节点 b 从节点 a 的儿子中删除。
或者修改节点 a 的值或者查询节点 a 的值。
对,就是传说中的 增删改查 。
添加儿子节点有两种情况,一种是给 object 增加儿子, 一种是给 array 增加儿子。
object 和 array 相比, 仅仅多了一个操作 ,即设置 key .
所以我们可以再 object 中设置完 key 之后再调用 给 array 添加儿子的操作来实现给 object 添加儿子。
具体参考胆码。c 链表的定义和使用
/* Utility for array list handling. */
static void suffix_object(cJSON *prev,cJSON *item) {
//两个兄弟的指针互相指向对方
prev->next=item;
item->prev=prev;
}
/* Add item to array/object. */
void cJSON_AddItemToArray(cJSON *array, cJSON *item) {
cJSON *c=array->child;
if (!item) return;
if (!c) {
array->child=item; //之前没有儿子,直接添加
} else {
while (c && c->next) c=c->next; // 先找到最后一个儿子。
suffix_object(c,item); // 添加儿子, c 是 item 的兄弟
}
}
void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item) {
if (!item) return;
if (item->string) cJSON_free(item->string);//这个 儿子之前有key, 先清理了。
item->string=cJSON_strdup(string); // 设置 key
cJSON_AddItemToArray(object,item); // 添加儿子
}

实际上上面这两个操作即可满足我们的添加需求了。
但是 cjson 为了我们更方便的使用添加节点的操作, 它又封装了一些操作, 当然使用宏定义封装的。
比如我们平常给 object 增加一个 false 儿子需要这样
cJSON_AddItemToObject(object, name, cJSON_CreateFalse())
现在我们只需要这样
cJSON_AddFalseToObject(object,name)
具体实现方式就是定义一个宏。
而且 cjson 只定义了对象的添加,而没有对数组定义这个宏。
大概原因是那时候, 一般一个数组内的元素的类型都是相同的吧, 不像对象这么灵活。
/* Macros for creating things quickly. */
#define cJSON_AddNullToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateNull())
#define cJSON_AddTrueToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue())
#define cJSON_AddFalseToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse())
#define cJSON_AddBoolToObject(object,name,b) cJSON_AddItemToObject(object, name, cJSON_CreateBool(b))
#define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n))
#define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s))
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-57098-3.html
论文就有立足之地
我也不是想坑你