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

来源:互联网 发布:傲娇熊直播 知乎 编辑:程序博客网 时间:2024/05/23 19:19

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 objectcJSON *root = cJSON_CreateObject();cJSON_AddStringToObject(root, "type", "friend-list");cJSON_AddNumberToObject(root, "status", 1);//create a new json arraycJSON *array = cJSON_CreateArray(), *item;//add the json array to rootcJSON_AddItemToObject(root, "list", array);int i;//add new json items to arrayfor(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字符串的结构比较简单的话貌似效率还更高一点?

0 0
原创粉丝点击