C/C++下的JSON解析/生成库cJSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,可读性强,同时便于机器生成和解析。cJSON是一个轻量级,便携,单文件的JSON解析器。

项目主页:http://sourceforge.net/projects/cjson/

cJSON结构体的定义如下:

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;

一个cJSON结构体可以看成一个双向链表的节点,并且这个节点可能有儿子节点。一个节点是一个键值对,key的类型为字符串,value的类型可能是字符串或数字(整数或浮点数)或其他JSON对象(比如JSON数组)

第一次接触这个库是在做聊天软件的时候,用JSON字符串在服务器和客户端之间传递消息。因此以传递聊天消息的代码作为示例。

1.将JSON字符串解析为cJSON对象并获取字段值:

char *str = "{\"type\":\"login-receipt\",\"username\":\"entalent\",\"status\":1}";
cJSON* root = cJSON_Parse(str);
char *username = cJSON_GetObjectItem(root, "username")->valuestring;
int status = cJSON_GetObjectItem(root, "status")->valueint;
free(root);

调用cJSON_Parse函数可以解析JSON字符串,并返回指向一个cJSON结构体的指针。调用cJSON_GetObjectItem可以获取一个cJSON结构体(一个键值对),并且可以取出字段值。

对于JSON数组,对应的操作如下:

char *str = "{\"type\":\"friend-list\",\
		\"username\":\"entalent\",\
		\"size\":2,\
		\"list\":[\
			{\"username\":\"green\", \"status\":1},\
			{\"username\":\"niang\", \"status\":0}\
		]}";
	cJSON* root = cJSON_Parse(str);
	char *username = cJSON_GetObjectItem(root, "username")->valuestring;
	cJSON *list = cJSON_GetObjectItem(root, "list");
	int size = cJSON_GetArraySize(list);
	int i;
	for(i = 0; i < size; i++){
		cJSON *item = cJSON_GetArrayItem(list, i);
		char *username = cJSON_GetObjectItem(item, "username")->valuestring;
		int status = cJSON_GetObjectItem(item, "status")->valueint;
		printf("%s %d\n", username, status);
	}
	free(root);

如果cJSON结构体指针指向一个JSON数组,那么调用cJSON_GetArraySize可以获取数组长度,调用cJSON_GetArrayItem可以获取数组中某个位置的元素。(当然位置是从0开始的)

2.将数据转换为JSON字符串并输出:

//create a new cJSON object
	cJSON *root = cJSON_CreateObject();
	cJSON_AddStringToObject(root, "type", "friend-list");
	cJSON_AddNumberToObject(root, "status", 1);
	//create a new json array
	cJSON *array = cJSON_CreateArray(), *item;
	//add the json array to root
	cJSON_AddItemToObject(root, "list", array);
	int i;
	//add new json items to array
	for(i = 0; i < 2; i++){
		cJSON_AddItemToArray(array, item = cJSON_CreateObject());
		cJSON_AddNumberToObject(item, "status", i);
	}
	
	char *str = cJSON_Print(root);
	printf("%s\n", str);
	free(root);
//如果任性的话直接sprintf生成JSON字符串貌似也不是不可以。。。而且JSON字符串的结构比较简单的话貌似效率还更高一点?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值