开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第25天,点击查看活动详情
之前写了关于cJSON的解析和创建的接口使用。 下面写一下修改Json树的接口调用流程。
流程
- 需要按照Json结构,解析json字符串。得到Json的结构树。
- 按照需要,定位到需要修改的节点,调用对应类型的接口,修改节点值。
接口说明
删除节点
cJSON_DetachItemFromArray:从数组结构找到目标节点删除,如果不使用,需要手动释放
cJSON_DeleteItemFromArray:从数组结构找到目标节点并删除,同时释放内存
cJSON_DetachItemFromObject:从对象结构找到目标节点并删除,如果不使用,需要手动释放
cJSON_DeleteItemFromObject:从对象结构找到目标节点并删除,同时释放内存
更新节点
cJSON_InsertItemInArray:插一条节点到指定的数组中
cJSON_ReplaceItemInArray:更新一个节点到数组中,按照下标找到节点,删除并同位置替换他
cJSON_ReplaceItemInObject:更新一个节点到对象中,按照Key定位节点,删除并同位置替换他
修改值
cJSON_SetNumberValue:修改当前节点的值,需要原本类型就是数值类型
cJSON_SetValuestring:修改当前节点的值,类型字符串
cJSON_SetBoolValue:修改当前节点的值,类型BOOL
使用这些接口,可以实现对一个Json结构的删改操作了。
代码示例
实现对一个指定Json实现删除和修改的操作演示。测试的Json如下;
代码:
#include<stdio.h>
#include <stdlib.h>
#include<unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "cJSON.h"
static char* cfgPath = "./tt";
int main(int argc, char** argv)
{
char Buf[4096] = {0};
int bfd = open(cfgPath,O_RDWR);
read(bfd,Buf,4095);
fprintf(stdout,"\t\t\t\t read json Buf:[%s]",Buf);
close(bfd);
//解析我们读到的Json字符串
cJSON* JsonMain = cJSON_Parse(Buf);
//删除tt1的节点
cJSON_DeleteItemFromObject(JsonMain,"tt1");
//定位到tt2的节点,并修改其值
cJSON* TempPtr = cJSON_GetObjectItem(JsonMain,"tt2");
cJSON_SetValuestring(TempPtr,"Now End!");
//定位数组,因为他属于itmes节点,所以找到items节点,它的值就是数组了
TempPtr = cJSON_GetObjectItem(JsonMain,"items");
//定位第二个数组,因为索引从0开始计算,所以参数为1
TempPtr = cJSON_GetArrayItem(TempPtr,1);
//定位到nm节点,并修改nm节点的数值
TempPtr = cJSON_GetObjectItem(TempPtr,"nm");
cJSON_SetValuestring(TempPtr,"guxiang de hai");
char* str1= cJSON_Print(JsonMain);
fprintf(stdout,"\t\t\t\t result json :\n%s\n",str1);
//释放资源
cJSON_Delete(JsonMain);
cJSON_free(str1);
return 0;
}
测试结果如下:
可以看出来,已经删除和修改成功。
接口的使用如同数据库的基本操作一般,对一个json数据结构,进行增删改查操作。
接口还有一些其他用的比较少的,没有写到接口介绍里。
初级使用的时候介绍的接口够用了,如果有新需求且接口不够满足,可以查看官方的接口和readme文档,会有帮助的。