cjson学习

mac2026-09-02  4

一,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函数

1,extern cJSON *cJSON_Parse(const char *value); 

作用:从缓冲区中解析出JSON结构,解析一块JSON数据返回cJSON结构, 在使用完之后调用cJSON_Delete函数释放json对象结构。

例子:

char *ptr = "{\"name\":\"sunshuai\"}"; cJSON *cj = cJSON_Parse(ptr); cJSON_Delete(cj);

2,extern char *cJSON_Print(cJSON *item); 

作用:将传入的JSON结构转化为字符串,可用于输出到输出设备, 使用完之后free(char *) 。

例子:

char *tmp = cJSON_Print(cj); printf("%s\n",tmp); free(tmp);

3,创建一个值类型的数据 :

extern cJSON *cJSON_CreateNumber(double num); extern cJSON *cJSON_CreateString(const char *string); extern cJSON *cJSON_CreateArray(void);

4,创建一个对象(文档) :

extern cJSON *cJSON_CreateObject(void);

5,数组创建以及添加 :

cJSON *cJSON_CreateIntArray(const int *numbers,int count); void cJSON_AddItemToArray(cJSON *array, cJSON *item);  

6,JSON嵌套 :

【 向对象中增加键值对】 cJSON_AddItemToObject(root, "name", 值类型数据相关函数()); 【 向对象中增加数组】 cJSON_AddItemToObject(root, "name", cJSON_CreateArray()); 【 向数组中增加对象】 cJSON_AddItemToArray(array, cJSON_CreateObject());

7,几个能提高操作效率的宏函数 :

#define cJSON_AddNumberToObject(object,name,n) \ cJSON_AddItemToObject(object, name,cJSON_CreateNumber(n))  #define cJSON_AddStringToObject(object,name,s)\  cJSON_AddItemToObject(object, name, cJSON_CreateString(s)) 

8,根据键找json结点 :

extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string)

找到节点后就可以得出相应的值

9,返回数组结点array中成员的个数 :

extern int cJSON_GetArraySize(cJSON *array);

10,根据数组下标index取array数组结点的第index个成员 返回该成员节点 :

extern cJSON *cJSON_GetArrayItem(cJSON *array,int index);

11,遍历数组 :

#define cJSON_ArrayForEach(pos, head)        for(pos = (head)->child; pos != NULL; pos = pos->next)

 

三,一个例子

#include <cJSON.h> #include <stdio.h> #include <stdlib.h> #include <string.h> //#define SUN void test(); int main(int argc ,char** argv) { test(); return 0; } void test(void) { FILE* fp; cJSON* tmp = NULL; char *ptr = NULL; cJSON* root = cJSON_CreateObject(); cJSON* item1 = cJSON_CreateObject(); cJSON* item2 = cJSON_CreateObject(); cJSON* item3 = cJSON_CreateObject(); cJSON* array = cJSON_CreateArray(); cJSON_AddItemToArray(array, item1); cJSON_AddItemToArray(array, item2); cJSON_AddItemToArray(array, item3); cJSON_AddItemToObject(root, "array1", array); fp = fopen("StringAndInt.json","w"); cJSON_AddStringToObject(item1, "name1","小红"); cJSON_AddStringToObject(item1, "name2","小明"); cJSON_AddNumberToObject(item2, "name3",1); cJSON_AddNumberToObject(item2, "name4",2); cJSON_AddStringToObject(item3, "name5","小孙"); cJSON_AddNumberToObject(item3, "name6",3); tmp = cJSON_GetArrayItem(array, 0); ptr = cJSON_Print(tmp); printf("%s\n",ptr); //cJSON_AddItemToObject(root,); #ifdef SUN tmp = cJSON_GetObjectItem(root,"name1"); if(tmp) { printf("%s\n",tmp->valuestring); } tmp = cJSON_GetObjectItem(root,"name4"); if(tmp) { printf("%d\n",tmp->valueint); } #endif ptr = cJSON_Print(root); printf("%s\n",ptr); fwrite(ptr, strlen(ptr), 1, fp); fclose(fp); cJSON_Delete(root); }

输出结果:

{ "name1": "小红", "name2": "小明" } { "array1": [{ "name1": "小红", "name2": "小明" }, { "name3": 1, "name4": 2 }, { "name5": "小孙", "name6": 3 }] }

 

编译时加 -lcjson.在

#include <stdio.h> #include <stdlib.h> #include "cJSON.h" int create_js(void) { //创建简单的json cJSON *root; root = cJSON_CreateObject(); if (!root) { printf("get root faild !\n"); return -1; } else printf("get root success!\n"); cJSON * js_body; const char * const body = "body"; cJSON_AddItemToObject(root, body, js_body = cJSON_CreateObject()); cJSON_AddStringToObject(js_body, "name", "xiaohui"); cJSON_AddNumberToObject(js_body, "value", 600); char *s = cJSON_PrintUnformatted(root); if (s) { printf("create js string is %s\n", s); free(s); } cJSON_Delete(root); return 0; } int create_jsArray(void) //创建数组 { cJSON *root; root = cJSON_CreateArray(); cJSON_AddItemToArray(root, cJSON_CreateString("Hello world")); cJSON_AddItemToArray(root, cJSON_CreateNumber(10)); { char *s = cJSON_Print(root); char *s = cJSON_PrintUnformatted(root); if (s) { printf(" %s \n", s); free(s); } } if (root) cJSON_Delete(root); return 0; } int create_jsArray2(void) //对象里面一个数组,数组里面包括对象 { cJSON *root, *js_body, *js_list; root = cJSON_CreateObject(); cJSON_AddItemToObject(root, "body", js_body = cJSON_CreateArray()); cJSON_AddItemToArray(js_body, js_list = cJSON_CreateObject()); cJSON_AddStringToObject(js_list, "name", "xiaohui"); cJSON_AddNumberToObject(js_list, "status", 100); { char *s = cJSON_Print(root); char *s = cJSON_PrintUnformatted(root); if (s) { printf(" %s \n", s); free(s); } } if (root) cJSON_Delete(root); return 0; } int parse_js() { char *s = "{\"name\":\"xiao hong\",\"age\":10}"; cJSON *root = cJSON_Parse(s); if (!root) { printf("get root faild !\n"); return -1; } cJSON *name = cJSON_GetObjectItem(root, "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(root, "age"); if (!age) { printf("no age!\n"); return -1; } printf("age type is %d\n", age->type); printf("age is %d\n", age->valueint); return 0; } int parse_js2() { 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; } int parse_jsArray() { 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); return 0; } int parse_jsArray2() { 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 == NULL) { break; } p = cJSON_PrintUnformatted(item); it = cJSON_Parse(p); free(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); return 0; } int main(int argc, char **argv) { // create_js(); //创建简单的json {"body":{"name":"xiaohui","value":600}} // create_jsArray(); //创建数组 ["Hello world",10] // create_jsArray2(); //复杂数组 {"body":[{"name":"xiaohui","status":100}]} // parse_js(); //{"name":"xiao hong","age":10}" // parse_js2(); //{"list":{"name":"xiao hong","age":10},"other":{"name":"hua hua"}}"; // parse_jsArray(); //{"list\":["name1","name2"]} parse_jsArray2();//{"list\":[{"name":"xiao hong","age":10},{"name":"hua hua","age":11}]} return 0; }

官网下的源码编译后,把动态库文件放入/usr/lib 然后执行ldconfig.

ldconfig命令的用途主要是在默认搜寻目录/lib和/usr/lib以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件。缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表,为了让动态链接库为系统所共享,需运行动态链接库的管理命令ldconfig,此执行程序存放在/sbin目录下。如果动态库文件没有放在/lib 和/usr/lib中,需要将动态库目录放入/etc/ld.so.conf中,然后ldconfig     

 

最新回复(0)