// 节点从双向链表中删除即可
cJSON *cJSON_DetachItemFromArray(cJSON *array,int which) {
cJSON *c=array->child;
while (c && which>0) c=c->next,which--;
if (!c) return 0;
if (c->prev) c->prev->next=c->next;
if (c->next) c->next->prev=c->prev;
if (c==array->child) array->child=c->next;
c->prev=c->next=0;
return c;
}
cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string) {
int i=0;
cJSON *c=object->child;
while (c && cJSON_strcasecmp(c->string,string)) i++,c=c->next;
if (c) return cJSON_DetachItemFromArray(object,i);
return 0;
}
对于一般类型的item, 我们直接就得到对应的节点.
但是对于 array 和 object , 我们需要查找对应的节点, 所以就需要去查找了。
这个查找算法由 cjson 的储存节点方式决定着。
由于cjson 采用链表储存了, 所以查找当时只能是暴力遍历了。
cJSON *cJSON_GetArrayItem(cJSON *array,int item) {
cJSON *c=array->child;
while (c && item>0) item--,c=c->next;
return c;
}
cJSON *cJSON_GetObjectItem(cJSON *object,const char *string) {
cJSON *c=object->child;
while (c && cJSON_strcasecmp(c->string,string)) c=c->next;
return c;
}
我们查找到对应的节点了,就可以对节点进行简单的修改了。
什么是简单的修改呢?
节点的类型不是 array 和 object 都可以算是简单类型,可以直接修改修改其值即可。
但是对于 array 和 object, 我们想给他赋值的话,涉及到释放就得内存这个问题。

下面我们来看看 cjson 的实现代码。
/* Replace array/object items with new ones. */
void cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem) {
cJSON *c=array->child;
while (c && which>0) c=c->next,which--;
if (!c) return;
newitem->next=c->next;
newitem->prev=c->prev;
if (newitem->next) newitem->next->prev=newitem;
if (c==array->child) array->child=newitem;
else newitem->prev->next=newitem;
c->next=c->prev=0;
cJSON_Delete(c);
}
void cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem) {
int i=0;
cJSON *c=object->child;
while(c && cJSON_strcasecmp(c->string,string))i++,c=c->next;
if(c) {
newitem->string=cJSON_strdup(string);
cJSON_ReplaceItemInArray(object,i,newitem);
}
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-57098-5.html
你是喝到肚子
我真不知道蛆是怎么活出来的