c创建json对象 C/C++下的JSON解析/生成库cJSON
发布时间:2017-04-24
来源:服务器之家
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,可读性强,同时便于机器生成和解析。cJSON是一个轻量级,便携,单文件的JSON解析器。
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字符串的结构比较简单的话貌似效率还更高一点?