cJSON
cJSON为json解析库,用于构建解析Json格式。
cJSON 开源项目位置:点击打开链接
JSON 主页:http://www.json.org/
json结构体
typedef struct cJSON {
struct cJSON *next,*prev;
struct cJSON *child;
int type;
char *valuestring;
int valueint;
double valuedouble;
char *string;
} cJSON;
说明
-
cJSON结构体为双向链表,可利用child指针可访问下一层
-
type决定了数据项(键)类型,valueint对应整形数据,其他类似
-
string为节点名称,即:键名称
封装json函数说明
-
cJSON_CreateObject(); //创建根数据对象
-
cJSON_AddStringToObject(usr,"name","fengxin"); //在usr根数据中加入string类型的键,键名为:name,键值为:fengxin
-
cJSON_Print(usr); //将json形式打印成正常字符串形式,因json中的string与普通string不同,需要进行转换使用
-
cJSON_PrintUnformatted(usr) ; //用法与上同,区别在于该函数转换的格式不带\t、\n,不如3转换后美观
-
cJSON_Delete(usr) ; //内存回收
-
cJSON_AddItemToArray(root, cJSON_CreateString("Hello world")); //在usr根数据中添加string类型的数组
-
cJSON_AddItemToArray(root, cJSON_CreateNumber(10)); //添加整型数组
解析json数据
-
将普通json串变成json对象,即创建json root过程
cJSON *root; root = cJSON_Parse(js_string);
-
提取关键字,从辈分高的祖层开始拿,其次为父层...
例:out={"name":"fengxin","passwd":"123","num":1}
cJSON *json,*json_name,*json_passwd,*json_num; json = cJSON_Parse(out); //解析成json形式 json_name = cJSON_GetObjectItem( json , "name" ); //获取键值内容 json_passwd = cJSON_GetObjectItem( json , "passwd" ); json_num = cJSON_GetObjectItem( json , "num" );
含父层例:s = {"list":{"name":"xiao hong","age":10},"other":{"name":"hua hua"}}
char *s = "{\"list\":{\"name\":\"xiao hong\",\"age\":10},\"other\":{\"name\":\"hua hua\"}}"; cJSON *root = cJSON_Parse(s); if(!root) { printf("get root faild !\n"); return -1; } cJSON *js_list = cJSON_GetObjectItem(root, "list"); if(!js_list) { printf("no list!\n"); return -1; } printf("list type is %d\n",js_list->type); cJSON *name = cJSON_GetObjectItem(js_list, "name"); if(!name) { printf("No name !\n"); return -1; } printf("name type is %d\n",name->type); printf("name is %s\n",name->valuestring); cJSON *age = cJSON_GetObjectItem(js_list, "age"); if(!age) { printf("no age!\n"); return -1; } printf("age type is %d\n", age->type); printf("age is %d\n",age->valueint); cJSON *js_other = cJSON_GetObjectItem(root, "other"); if(!js_other) { printf("no list!\n"); return -1; } printf("list type is %d\n",js_other->type); cJSON *js_name = cJSON_GetObjectItem(js_other, "name"); if(!js_name) { printf("No name !\n"); return -1; } printf("name type is %d\n",js_name->type); printf("name is %s\n",js_name->valuestring); if(root) cJSON_Delete(root); return 0;
这里考虑严格,先进行了item判断,随后才进行取值
-
json数组提取
例:{"list":["name1","name2"]}
char *s = "{\"list\":[\"name1\",\"name2\"]}"; cJSON *root = cJSON_Parse(s); if(!root) { printf("get root faild !\n"); return -1; } cJSON *js_list = cJSON_GetObjectItem(root, "list"); if(!js_list){ printf("no list!\n"); return -1; } int array_size = cJSON_GetArraySize(js_list); printf("array size is %d\n",array_size); int i = 0; cJSON *item; for(i=0; i< array_size; i++) { item = cJSON_GetArrayItem(js_list, i); printf("item type is %d\n",item->type); printf("%s\n",item->valuestring); } if(root) cJSON_Delete(root);
-
数组中包含对象的提取
例:{"list":[{"name":"xiao hong","age":10},{"name":"hua hua","age":11}]}
char *s = "{\"list\":[{\"name\":\"xiao hong\",\"age\":10},{\"name\":\"hua hua\",\"age\":11}]}"; cJSON *root = cJSON_Parse(s); if(!root) { printf("get root faild !\n"); return -1; } cJSON *js_list = cJSON_GetObjectItem(root, "list"); if(!js_list){ printf("no list!\n"); return -1; } int array_size = cJSON_GetArraySize(js_list); printf("array size is %d\n",array_size); int i = 0; cJSON *item,*it, *js_name, *js_age; char *p = NULL; for(i=0; i< array_size; i++) { item = cJSON_GetArrayItem(js_list, i); if(!item) { //TODO... } p = cJSON_PrintUnformatted(item); it = cJSON_Parse(p); if(!it) continue ; js_name = cJSON_GetObjectItem(it, "name"); printf("name is %s\n",js_name->valuestring); js_age = cJSON_GetObjectItem(it, "age"); printf("age is %d\n",js_age->valueint); } if(root) cJSON_Delete(root);