cJSON

前端之家收集整理的这篇文章主要介绍了cJSON前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

优点:cJSON只有cJSON.h和cJSON.c两个文件、600行代码可以直接加到工程项目中,不必编译成库使用。

结论:优先使用cJSON


cJSON结构:

/* The cJSON structure: */
typedef struct cJSON {
	struct cJSON *next,*prev;	/* next/prev allow you to walk array/object chains. Alternatively,use GetArraySize/GetArrayItem/GetObjectItem */
	struct cJSON *child;		/* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */

	int type;					/* The type of the item,as above. */

	char *valuestring;			/* The item's string,if type==cJSON_String */
	int valueint;				/* The item's number,if type==cJSON_Number */
	double valuedouble;			/* The item's number,if type==cJSON_Number */

	char *string;				/* The item's name string,if this item is the child of,or is in the list of subitems of an object. */
} cJSON;


使用过程:


1.创建

cJSON *cjson = cJSON_CreateObject();   //创建一个对象节点
        cJSON *cjson = cJSON_CreateArrary();    //创建一个数组
        cJSON *cjson = cJSON_CreateString(const char *ch);    //创建一个字符串类型的节点,保存ch
        cJSON *cjson = cJSON_CreateNumber(double n);    //创建一个数字类型的节点,保存n,不分整数和浮点数
        ...

cJSON_CreateXXX内部使用malloc分配动态内存,使用完后一定调用

cJSON_Delete(cjson);


2.解析

char *ch = "{\"name\":\"rongxiaojun\",\"object\":[\"xys\",\"hdm\",\"qinxiaohui,my friend\",\"songtao,laji\"]}";
        cJSON *cjson = cJSON_Parse(ch);

温馨提示

a.若字符串格式不符合规范,cJSON_Parse返回0

b.使用完后使用cJSON_Delete(cjson)进行空间释放


3.输出

char* ch = cJSON_Print(cJSON *cjson);

内部用malloc为ch分配了空间,所以使用完后需free(ch)


4.取节点

4.1对象节点

//取cjson中名字为"name"的子节点,故cj->string = "name"
        cJSON *cj = cJSON_GetObjectItem(cjson,"name");

4.2数组节点

//从cjson数组取第n个元素(数组元素也为节点)
        cJSON *cj = cJSON_GetArrayItem(cjson,n);

温馨提示:字段不存在均返回0


5.取值

char *ch = cjson->valuestring;
	int n = cjson->valueint;
	double d = cjson->valuedouble;

6.取节点名字

char *ch = cj->string;

注意:取名操作通常用于子节点,因为顶级节点没名所以对顶级节点取名会出错


7.添加节点

7.1 添加普通对象节点

cJSON_AddStringToObject(cjson,"name","rongxiaojun");
        cJSON_AddNumberToObject(cjson,n);

7.2 添加数组节点

cJSON_AddItemToArray(cj,cJSON_CreateString("shilaji"));
        cJSON_AddItemToArray(cj,cJSON_CreateNumber(n));

温馨提示:cJSON在添加数字时不区分整数和浮点数,该值被同时赋给cjson->valueint和cjson->valuedouble,用户根据需要取出对应值


8. 删除节点

8.1 删除普通对象节点

删除key为name的节点

cJSON_DeleteItemFromObject(cjson,"name");

8.2 删除数组节点

删除数组中第2个元素

cJSON_DeleteItemFromArray(cjson,2);
温馨提示:cJSON_DeleteItemFrom*函数删除节点时内存即清理,故不存在内存泄露问题,可放心使用。


9.数组


9.1 取数组个数

int num =cJSON_GetArraySize(cj);


9.2 取节点

/*从cjson数组取第n个元素(数组元素也为节点)*/        
cJSON *cj = cJSON_GetArrayItem(cjson,n);  
//不存在返回0

9.3 添加节点

cJSON_AddItemToArray(cj,cJSON_CreateString("shilaji"));
cJSON_AddItemToArray(cj,cJSON_CreateNumber(n));

示例

cJSON *cjson = cJSON_CreateArray();
		
		cJSON_AddItemToArray(cjson,cJSON_CreateString("123456"));
		cJSON_AddItemToArray(cjson,cJSON_CreateString("nihaihaoma"));
		cJSON_AddItemToArray(cjson,cJSON_CreateString("jintianxingqiwule"));

		int iCnt = cJSON_GetArraySize(cjson);
		for(int i = 0; i != iCnt; ++i)
			printf("%s\n",cJSON_GetArrayItem(cjson,i)->valuestring);
结果



10.验证字段存在

if(cJSON_GetObjectItem(cjson,str.c_str()) == NULL)
                return false;
        else
                return true;

11.bool操作

a.添加:cJSON_AddBoolToObject(cjson,flag);

b.读取:bool bRes = cJSON_GetObjectItem(cjson,"name")->type;


//从cjson数组取第n个元素(数组元素也为节点) cJSON *cj = cJSON_GetArrayItem(cjson,n);

猜你在找的Json相关文章