cJSON使用文档——超详细

查了一下没有发现关于cJSON的函数api的使用文档,那就自己看源代码整理一份吧,这比单纯分析源代码貌似有用多了

整理一份源代码的使用文档,就不得不首先看下各个函数的定义,防止漏掉一些API,同时也对撰写文档的内容有了大概的了解。

cJSON版本Version: 1.7.14

cJSON_Version

CJSON_PUBLIC(const char*) cJSON_Version(void);  打印当前cJSON的版本

使用:

printf("Version: %s\n", cJSON_Version());

cJSON_InitHooks

CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks);初始化hooks, 不同系统内存分配函数稍有差别,通过cJSON_InitHooks实现兼容。

使用:

cJSON_Hooks* hooks=NULL;cJSON_InitHooks(hooks);

cJSON_Parse

CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);  序列化json字符串

使用:

char * string = "{\"name\":\"xxx\", \"name2\":\"xxx2\"}";cJSON * root = cJSON_Parse(string);

cJSON_ParseWithLength

CJSON_PUBLIC(cJSON *) cJSON_ParseWithLength(const char *value, size_t buffer_length);  //和 cJSON_Parse没有太大区别,其内部也要计算json字符串的长度

使用:

char * string = "{\"name\":\"xxx\", \"name2\":\"xxx2\"}";cJSON * root = cJSON_ParseWithLength(string, strlen(string)+sizeof(""));//考虑到字符串末尾的长度

cJSON_ParseWithOpts

CJSON_PUBLIC(cJSON*) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated);也是格式化json字符串return_parse_end, require_null_terminated默认传0

使用:

char * string = "{\"name\":\"xxx\",\"name2\":\"xxx2\"\"}";cJSON * root = cJSON_ParseWithOpts(string, 0, 0);if(root==NULL){
	   printf("Error_content : %s\n", cJSON_GetErrorPtr());}else printf("%s\n", cJSON_Print(root));

cJSON_ParseWithLengthOpts

CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_bool require_null_terminated);参数要求同cJSON_ParseWithOpts一致

使用:

char * string = "{\"name\":\"xxx\",\"name2\":\"xxx2\"}";cJSON * root = cJSON_ParseWithLengthOpts(string, strlen(string)+sizeof(""), 0, 0);if(root==NULL){
	printf("Error_content : %s\n", cJSON_GetErrorPtr());}else printf("%s\n", cJSON_Print(root));

cJSON_Print

CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item);格式化打印json对象

使用:
同cJSON_ParseWithLengthOpts函数用法一致

cJSON_PrintUnformatted

CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item);非格式化打印json对象

使用:同cJSON_Print使用方法一致

cJSON_PrintBuffered

CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt);使用缓冲策略将cJSON实体渲染为文本。prebuffer是对最终大小的猜测。猜得好会减少再分配(意思就是最好渲染成文本的长度刚好就是prebuffer的长度,如果不够,会一直触发再分配内存函数直到满足为止,这就消耗太多时间)。
fmt=0表示未格式化,=1表示格式化

使用:

char * string = "{\"name\":\"xxxxxxxxxxxxxxx\",\"name2\":\"xxx2\"}";cJSON * root = cJSON_Parse(string);if(root==NULL){
	printf("Error_content : %s\n", cJSON_GetErrorPtr());}else{
	//为了只需要一次性分配内存,prebuffer大一点比较好,但也不要太大,这个看情况估计,下面的都是刚刚好
	printf("%s\n", cJSON_PrintBuffered(root, strlen(string), 0));//非格式化输出
	printf("%s\n", cJSON_PrintBuffered(root, strlen(string), 1)); //格式化输出}

cJSON_PrintPreallocated

CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format);注意:cJSON并不总是100%准确地估计它将使用多少内存,所以为了安全起见,要比实际需要多分配5个字节。而且使用cJSON_PrintPreallocated的话,缓冲区就全部由调用者控制,内存的分配与回收调用者需要十分清楚

使用:暂无

cJSON_Delete

CJSON_PUBLIC(void) cJSON_Delete(cJSON *item);删除json对象

使用:

char * string = "{\"name\":\"xxxxxxxxx\",\"name2\":\"xxx2\"}";cJSON * root = cJSON_Parse(string);if(root==NULL){
	printf("Error_content : %s\n", cJSON_GetErrorPtr());}else{
	printf("%s\n", cJSON_PrintUnformatted(root));
	cJSON_Delete(root);//root指向的地址没有改变,但是无法使用那块内存,所以用给root赋值NULL好判断
	root = NULL;
	if(root==NULL)printf("删除成功\n");
	else printf("%s\n", cJSON_PrintUnformatted(root));}

cJSON_GetArraySize

CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array);返回数组(或对象)中的项数,就是获取数组大小/对象/项。所谓的项数,就是同一层下,有多少对键值对

使用:

char * string = "{\"name\":\"xxxxxxxxx\",\"name2\":\"xxx2\"}";cJSON * root = cJSON_Parse(string);if(root==NULL){
	printf("Error_content : %s\n", cJSON_GetErrorPtr());}else{
	printf("%d\n", cJSON_GetArraySize(root));//输出2,因为root下面有两对键值对}

cJSON_GetArrayItem

CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index);从数组“array”中检索项目编号“index”。如果不成功,则返回NULL。
就是在json对象当前层下,可以通过索引遍历键名和键值。注意,cJSON_GetArrayItem返回的是cJSON *类型,通过查看该类型的数据结构从而正确访问键名和键值

使用:

char * string = "{\"name\":\"xxxxxxxxx\",\"name2\":\"xxx2\"}";cJSON * root = cJSON_Parse(string);if(root==NULL){
	printf("Error_content : %s\n", cJSON_GetErrorPtr());}else{
	for(int i=0; i<cJSON_GetArraySize(root); i++){
		cJSON * temp = cJSON_GetArrayItem(root, i);
		if(temp != NULL)printf("root[%s] = %s\n", temp->string, temp->valuestring);
	}}

cJSON_GetObjectItem

CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string);如果想直接通过键名的方式获得键值,可以通过此方法。定位到想要的键名的层次之后,调用此函数即可。(注意,输入的键名是不区分大小写的,也就是说cJSON_GetObjectItem(root, "name")和cJSON_GetObjectItem(root, "NAME"))是一样的。要是想要区分大小写,请使用cJSON_GetObjectItemCaseSensitive函数,使用方法跟cJSON_GetObjectItem一致

使用:

char * string = "{\"name\":\"xxxxxxxxx\",\"name2\":\"xxx2\"}";
  cJSON * root = cJSON_Parse(string);
   if(root==NULL){
       printf("Error_content : %s\n", cJSON_GetErrorPtr());
   }else{
       cJSON * temp = cJSON_GetObjectItem(root, "name");//通过键名访问键值
       printf("root[%s] = %s\n", temp->string, temp->valuestring);
       temp = cJSON_GetObjectItem(root, "name2");//通过键名访问键值
       printf("root[%s] = %s\n", temp->string, temp->valuestring);
   }

cJSON_HasObjectItem

CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string);用来判断查找的键名是否存在

使用:

char * string = "{\"name\":\"xxxxxxxxx\",\"test\":\"xxx2\"}";cJSON * root = cJSON_Parse(string);if(root==NULL){
   printf("Error_content : %s\n", cJSON_GetErrorPtr());}else{
   if(!cJSON_HasObjectItem(root, "name2"))printf("该键名不存在\n");
   if(cJSON_HasObjectItem(root, "name")){
       cJSON * temp = cJSON_GetObjectItem(root, "name");//通过键名访问键值
       printf("root[%s] = %s\n", temp->string, temp->valuestring);
   }}

cJSON_IsInvalid等

这些函数检查项目的类型CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item);CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item);CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item);CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item);CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item);CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item);CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item);CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item);CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item);CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item);

使用:

char * string = "{\"name\":\"xxxxxxxxx\",\"test\":\"xxx2\"}";cJSON * root = cJSON_Parse(string);if(root==NULL){
    printf("Error_content : %s\n", cJSON_GetErrorPtr());}else{
    cJSON *temp = cJSON_GetObjectItem(root, "name");
    //简单例子
    if(cJSON_IsInvalid(temp))printf("改对象是无效的\n");
    if(cJSON_IsString(temp))printf("是字符串\n");
    if(cJSON_IsFalse(temp))printf("是假\n");
    if(cJSON_IsTrue(temp))printf("是真\n");
    if(cJSON_IsBool(temp))printf("是布尔类型\n");
    if(cJSON_IsNull(temp))printf("是空\n");
    if(cJSON_IsNumber(temp))printf("是数字\n");
    if(cJSON_IsArray(temp))printf("是数组\n");}

cJSON_GetStringValue和cJSON_GetNumberValue

CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item);CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item);检查项目类型并返回其值

使用:

char * string = "{\"name\":\"xxxxxxxxx\",\"test\":\"xxx2\"}";cJSON * root = cJSON_Parse(string);if(root==NULL){
    printf("Error_content : %s\n", cJSON_GetErrorPtr());}else{
    if(cJSON_IsString(root))printf("%s\n", cJSON_GetStringValue(root));
    else printf("不是字符串类型\n");

    cJSON * temp = cJSON_GetObjectItem(root, "name");
    //判断该对象的值是不是字符串类型,并且通过特定函数直接获取
    if(cJSON_IsString(temp))printf("%s\n", cJSON_GetStringValue(temp));
    else printf("不是字符串类型\n");

    // GetNumberValue函数用法也是一样的}

cJSON_AddItemToArray等

以下是给json对象添加数组或对象或字符串等所需要的API函数CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item);CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name);CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name);CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name);CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean);CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number);CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw);CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name);CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name);

使用:

char * string = "{\"name\":\"xxxxxxxxx\"}";cJSON * root = cJSON_Parse(string);if(root==NULL){
    printf("Error_content : %s\n", cJSON_GetErrorPtr());}else{
    printf("添加键值对\n");
    cJSON_AddNullToObject(root, "isnull");
    // cJSON_AddTrueToObject(root, "istrue");//可能会莫名报错(执行后cJSON_Print(root)打印为空),原因未知
    // cJSON_AddFalseToObject(root, "isfalse");//可能会莫名报错(执行后cJSON_Print(root)打印为空),原因未知
    // cJSON_AddBoolToObject(root, "bool", 0);//可能会莫名报错(执行后cJSON_Print(root)打印为空),原因未知

    cJSON_AddStringToObject(root, "string_name", "test");
    cJSON_AddNumberToObject(root, "num", 123456);
    cJSON_AddObjectToObject(root, "new_obj");
    cJSON_AddRawToObject(root, "raw_obj", "{\"age\":\"110\"}");//所谓原生json就是还是字符串形式,需要格式化后才可使用
    cJSON_AddArrayToObject(root, "arr");
    
    printf("%s\n", cJSON_Print(root));}

cJSON_CreateNull等

这些调用将创建相应类型的cJSON项CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void);CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void);CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void);CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean);CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num);CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string);/* raw json */CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw);CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void);CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void);

使用:

char * string = "{\"name\":\"xxxxxxxxx\"}";cJSON * root = cJSON_Parse(string);if(root==NULL){
    printf("Error_content : %s\n", cJSON_GetErrorPtr());}else{
    printf("添加键值对\n");
    cJSON_AddItemToObject(root, "num", cJSON_CreateNumber(100));
    // cJSON_AddItemToObject(root, "is_null", cJSON_CreateNull());//可能会莫名报错(执行后cJSON_Print(root)打印为空),原因未知
    // cJSON_AddItemToObject(root, "is_true", cJSON_CreateTrue());//可能会莫名报错(执行后cJSON_Print(root)打印为空),原因未知
    // cJSON_AddItemToObject(root, "is_false", cJSON_CreateFalse());//可能会莫名报错(执行后cJSON_Print(root)打印为空),原因未知
    cJSON_AddItemToObject(root, "str", cJSON_CreateString("string"));
    cJSON_AddItemToObject(root, "raw_json", cJSON_CreateRaw("{\"age\":\"111\"}"));
    cJSON_AddItemToObject(root, "arr", cJSON_CreateArray());
    cJSON_AddItemToObject(root, "new_obj", cJSON_CreateObject());

    printf("%s\n", cJSON_Print(root));}

cJSON_CreateStringReference

CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string);创建一个字符串的引用(说白了就是常量字符串变量),但不可通过cJSON_Delete释放该引用( 源代码里面对引用类型的数据直接跳过,不做free处理 )。

使用:

char * string = "{\"key\":\"value\"}";cJSON * root = cJSON_Parse(string);if(root==NULL){
    printf("Error_content : %s\n", cJSON_GetErrorPtr());}else{
    cJSON * temp = cJSON_CreateStringReference("name");//只能获得键值,不能获得键名
    printf("%s : %s\n", temp->string, temp->valuestring);
    cJSON_Delete(temp);//无法通过引用删除,所以无效
    printf("%s : %s\n", temp->string, temp->valuestring);//还可以输出name}

同样的

CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child);CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child);这几个引用的用法跟cJSON_CreateStringReference是一样的

cJSON_CreateIntArray等

CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count);CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count);CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count);CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char *const *strings, int count);这四个都是创建数组的方式,区别是数组的值类型不同

使用:

char * string = "{\"key\":\"value\"}";int arr[] = {1,2,3,4};cJSON * root = cJSON_Parse(string);if(root==NULL){
    printf("Error_content : %s\n", cJSON_GetErrorPtr());}else{
    cJSON * temp = cJSON_CreateIntArray(arr, 4);
    temp->string = "arr_key";//设置键名
    cJSON_AddItemToArray(root,  temp);//将该键值对加入到root对象
    printf("%s\n", cJSON_Print(root));
    /*
        类似的,cJSON_CreateFloatArray、cJSON_CreateDoubleArray、cJSON_CreateStringArray函数的用法与上面的一致
    */}

cJSON_AddItemToArray等

CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item);CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item);将cJSON *类型的变量添加到json对象中

对于cJSON_AddItemToObjectCS函数,当字符串肯定是const(即一个等同于literal),并且肯定会在cJSON对象中保留下来时,使用此选项。注意:使用此函数时,请确保在使用前始终检查(item->type&cJSON_StringIsConst)是否为零

使用:

char * string = "{\"key\":\"value\"}";int arr[] = {1,2,3,4};cJSON * root = cJSON_Parse(string);if(root==NULL){
    printf("Error_content : %s\n", cJSON_GetErrorPtr());}else{
    cJSON * temp = cJSON_CreateIntArray(arr, 4);
    // temp->string = "arr_key";//设置键名
    // cJSON_AddItemToArray(root,  temp);//将该键值对加入到root对象

    //也可以通过别的方式设置键名
    cJSON_AddItemToObject(root, "arr_key", temp);
    printf("%s\n", cJSON_Print(root));}

cJSON_CreateObjectReference和cJSON_CreateArrayReference

CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child);CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child);创建不同类型对象的引用,如数组等

使用:暂无

cJSON_AddItemReferenceToArray和cJSON_AddItemReferenceToObject

CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item);如果想要将引用的cJSON*变量追加到json对象里面,上面两个函数可以解决该问题

使用:

char * string = "{\"key\":\"value\"}";int arr[] = {1,2,3};cJSON * root = cJSON_Parse(string);if(root==NULL){
    printf("Error_content : %s\n", cJSON_GetErrorPtr());}else{
    // cJSON * temp = cJSON_CreateArrayReference(arr);
    cJSON * temp = cJSON_CreateArrayReference(NULL);//相当于创建一个空数组,由于是引用,无法用cJSON_Delete删除
    // printf("%s\n", cJSON_Print(temp));
    cJSON_AddItemToObject(root, "arr_key", temp);//追加到root对象里面
    printf("%s\n", cJSON_Print(root));}

cJSON_DetachItemViaPointer等

从数组/对象中移除/分离项*/CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item);//cJSON_DetachItemViaPointer 通过指针分离键值对CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which);CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which);CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string);CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string);CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string);CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string);

使用:

//cJSON_DetachItemViaPointer:char * string = "{\"key\":\"value\", \"key2\":{\"key3\":\"value3\"}}";// int arr[] = {1,2,3};cJSON * root = cJSON_Parse(string);if(root==NULL){
    printf("Error_content : %s\n", cJSON_GetErrorPtr());}else{
    printf("%s\n", cJSON_Print(root));

    //cJSON_DetachItemViaPointer的使用
    cJSON * temp = cJSON_GetObjectItem(root, "key2");//获得该键名的json对象
    cJSON * temp2 = cJSON_GetObjectItem(temp, "key3");
    //root是要准备分离的总json对象,temp则指向root里面其中一个键值对
    //
    // cJSON_DetachItemViaPointer(root, temp2); //无效   开始分离temp2。 root和temp2必须处于连续的层次中,中间隔一层是无法分离的(故本次无效)
    cJSON_DetachItemViaPointer(root, temp);//可以分离
    printf("%s\n", cJSON_Print(root));}

//cJSON_DetachItemFromArray:char * string = "{\"key\":\"value\", \"key2\":[{\"index\":\"value\"},{\"index2\":\"value2\"}]}";// int arr[] = {1,2,3};cJSON * root = cJSON_Parse(string);if(root==NULL){
    printf("Error_content : %s\n", cJSON_GetErrorPtr());}else{
    printf("%s\n", cJSON_Print(root));

    // cJSON_DetachItemFromArray 的使用
    cJSON * temp = cJSON_GetObjectItem(root, "key2");//获得该键名的json对象
    cJSON_DetachItemFromArray(temp, 0);//分离数组第一个

    // cJSON_DetachItemFromObject(root, "key");//获取当前层下的key键名,通过键名删除key对象
    //cJSON_DetachItemFromObjectCaseSensitive和cJSON_DetachItemFromObject用法一致,前者区别大小写

    printf("%s\n", cJSON_Print(root));}

cJSON_DeleteItemFromArray与cJSON_DetachItemFromArray一致

cJSON_InsertItemInArray等

更新JSON对象CJSON_PUBLIC(cJSON_bool) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. 将预先存在的项向右移动*/CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement);CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem);CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem);CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object,const char *string,cJSON *newitem);

使用:

char * string = "{\"key\":\"value\", \"key2\":[{\"index\":\"value\"},{\"index2\":\"value2\"}]}";cJSON * root = cJSON_Parse(string);if(root==NULL){
    printf("Error_content : %s\n", cJSON_GetErrorPtr());}else{
    printf("%s\n\n", cJSON_Print(root));

    cJSON * temp = cJSON_GetObjectItem(root, "key2");//获得该键名的json对象
    cJSON * obj = cJSON_CreateObject();
    cJSON_AddStringToObject(obj, "name", "xxx");
    cJSON_InsertItemInArray(temp, 0, obj);//在数组key2第一个位置插入json对象obj
    printf("%s\n\n", cJSON_Print(root));


    cJSON * obj2 = cJSON_CreateObject();
    cJSON_AddStringToObject(obj2, "name2", "xxx2");
    cJSON_ReplaceItemViaPointer(temp, obj, obj2);//在temp对象中,将obj替换成obj2(只要可以找到该对象,就可以替换)
    // 同理,cJSON_ReplaceItemInArray、cJSON_ReplaceItemInObjectCaseSensitive、cJSON_ReplaceItemInObject用法同上,注意参数要求

    printf("%s\n", cJSON_Print(root));}

cJSON_Duplicate

CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse);该函数复制相同的cJSON对象,其中recurse若为1,则表示全部复制(包括深层次的json对象)

使用:

char * string = "{\"key\":\"value\", \"key2\":[{\"index\":\"value\"},{\"index2\":\"value2\"}]}";cJSON * root = cJSON_Parse(string);if(root==NULL){
    printf("Error_content : %s\n", cJSON_GetErrorPtr());}else{
    printf("%s\n\n", cJSON_Print(root));

    // cJSON *temp = cJSON_Duplicate(root, 0);
    cJSON *temp = cJSON_Duplicate(root, 1);
    printf("%s\n", cJSON_Print(temp));}

递归地比较两个cJSON项是否相等。如果a或b为空或无效,则它们将被视为不相等。
区分大小写确定对象键是区分大小写(1)还是不区分大小写(0CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive);

使用:

char * string = "{\"key\":\"value\", \"key2\":[{\"index\":\"value\"},{\"index2\":\"value2\"}]}";cJSON * root = cJSON_Parse(string);if(root==NULL){
    printf("Error_content : %s\n", cJSON_GetErrorPtr());}else{
    printf("%s\n\n", cJSON_Print(root));

    cJSON *temp = cJSON_Duplicate(root, 1);
    int bools = cJSON_Compare(root, temp, 1);//区分大小写
    printf("%d\n", bools);}

cJSON_Minify

CJSON_PUBLIC(void) cJSON_Minify(char *json);压缩字符串,删除字符串中的空白符

使用:

char * string = "{\"key\":\"v a l u e\"}";cJSON * root = cJSON_Parse(string);if(root==NULL){
    printf("Error_content : %s\n", cJSON_GetErrorPtr());}else{
    printf("%s\n\n", cJSON_Print(root));
    cJSON* temp = cJSON_GetObjectItem(root, "key");
    cJSON_Minify(temp->valuestring);//压缩字符串
    printf("%s\n", cJSON_Print(root));}

cJSON_ArrayForEach

用于迭代数组或对象的宏#define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next)

使用:

char * string = "{\"key\":\"value\", \"key2\":[{\"index\":\"value\"},{\"index2\":\"value2\"}]}";cJSON * root = cJSON_Parse(string);if(root==NULL){
    printf("Error_content : %s\n", cJSON_GetErrorPtr());}else{
    cJSON * temp = cJSON_GetObjectItem(root, "key2");
    cJSON * element; 
    cJSON_ArrayForEach(element, root){
        printf("%s\n", cJSON_Print(element));//迭代遍历json对象(只对当前层有效)
    }

    cJSON_ArrayForEach(element, temp){
        printf("%s\n", cJSON_Print(element));//迭代遍历数组
    }

    printf("%s\n", cJSON_Print(temp));}

               

上一篇:cJSON使用方法


下一篇:Cjsoncpp