cJson 修改接口的使用

1,092 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第25天,点击查看活动详情

之前写了关于cJSON的解析和创建的接口使用。 下面写一下修改Json树的接口调用流程。

流程

  1. 需要按照Json结构,解析json字符串。得到Json的结构树。
  2. 按照需要,定位到需要修改的节点,调用对应类型的接口,修改节点值。

接口说明

删除节点
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如下;

image.png 代码:

#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;
}

测试结果如下: image.png

可以看出来,已经删除和修改成功。
接口的使用如同数据库的基本操作一般,对一个json数据结构,进行增删改查操作。
接口还有一些其他用的比较少的,没有写到接口介绍里。
初级使用的时候介绍的接口够用了,如果有新需求且接口不够满足,可以查看官方的接口和readme文档,会有帮助的。