因此 cjson 还专门为 数组定义了下面的批量创建节点。
/* These utilities create an Array of count items. */
cJSON *cJSON_CreateIntArray(const int *numbers,int count);
cJSON *cJSON_CreateFloatArray(const float *numbers,int count);
cJSON *cJSON_CreateDoubleArray(const double *numbers,int count);
cJSON *cJSON_CreateStringArray(const char **strings,int count);
另外, 当我们要添加的节点已经在一个树上的时候, 再向另一个树中添加这个节点时, 这个节点的 pre 和 next 指针会被覆盖。
于是 cjson 又提供了一种引用性添加节点的方法。
简单的说就是在创建一个 item, 新创建的 item 的 value 指针直接指向原来的 value 值, 这样两个 item 就指向了同一个 item 了。
但是这个引用计数是个难题, cjson 也没有处理好, 只能引用一次, 大家可以想象怎么解决。
我们先来看看 cjson 的引用是怎么实现的。
/* Utility for handling references. */
static cJSON *create_reference(cJSON *item) {
cJSON *ref=cJSON_New_Item();
if (!ref) return 0;
memcpy(ref,item,sizeof(cJSON));
ref->string=0;
ref->type|=cJSON_IsReference;
ref->next=ref->prev=0;
return ref;
}
上面的引用计数仅仅存在 type 里面,显示是有问题的。
我们的 value 是保持不变的,所有的引用都指向这个value.
所以我们可以通过一个和 value 类似的东西, 大家都指向这个 东西, 新增加一个引用的时候加1, 释放一个引用的时候减一即可。
这个看着怎么那么像智能指针呢?
这个话题就说到这吧,实现方式很多的,大家自己多想想。
删除也是从 array 和 object 中删除,实现就比较简洁了。
void cJSON_DeleteItemFromArray(cJSON *array,int which) {
cJSON_Delete(cJSON_DetachItemFromArray(array,which));
}
void cJSON_DeleteItemFromObject(cJSON *object,const char *string) {
cJSON_Delete(cJSON_DetachItemFromObject(object,string));
}
Detach 是什么东西呢?
我们把一个节点从 json 树中删除, 但是不释放内存,而是先保留这个节点的指针, 这样储存在这个节点的信息都保留了下来。
接下来我们就可以做很多事了, 合适的时候添加到其他对象中, 合适的时候释放内存。
比如上面的 delete 函数, 就需要真实的删除了, 这个时候我们删除即可。
而 detach 实现也比较简单, 只是少了一步删除操作。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-57098-4.html
主要是他是无害通过
武统效果更好