# 下载 代码存储在git上,地址:https://github.com/DaveGamble/cJSON.git
用下面的命令下载 ``` git clone ?https://github.com/DaveGamble/cJSON.git ```
# 类型
``` #define cJSON_Invalid (0) #define cJSON_False ?(1 << 0) #define cJSON_True ? (1 << 1) #define cJSON_NULL ? (1 << 2) #define cJSON_Number (1 << 3) #define cJSON_String (1 << 4) #define cJSON_Array ?(1 << 5) #define cJSON_Object (1 << 6) #define cJSON_Raw ? ?(1 << 7) /* raw json */ ``` 共有7种json类型和一种非法类型
``` /* The cJSON structure: */ typedef struct cJSON { ? ? /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */ ? ? struct cJSON *next; ? ? struct cJSON *prev; ? ? /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */ ? ? struct cJSON *child;
? ? /* The type of the item, as above. */ ? ? int type;
? ? /* The item's string, if type==cJSON_String ?and type == cJSON_Raw */ ? ? char *valuestring; ? ? /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */ ? ? int valueint; ? ? /* The item's number, if type==cJSON_Number */ ? ? double valuedouble;
? ? /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */ ? ? char *string; } cJSON; ``` 首先,一个json结构包含三个指针:后一个节点,前一个节点和子json.
然后一个整型变量存储json的类型,类型就是上边的那8种之1。
当类型是cJSON_String和cJSON_Raw时,值存储在valuestring中,字符串指针类型。
极其不赞成写入整型,用cJSON_SetNumberValue替代。
当类型是cJSON_Number时,值存储在valuedouble中,类型为双精度浮点数。
键值对中键的名称保存在char *string中
``` typedef struct cJSON_Hooks { ? ? ? /* malloc/free are CDECL on Windows regardless of the default calling convention of the compiler, so ensure the hooks allow passing those functions directly. */ ? ? ? void *(CJSON_CDECL *malloc_fn)(size_t sz); ? ? ? void (CJSON_CDECL *free_fn)(void *ptr); } cJSON_Hooks; ```
此结构体,保存动态申请内存和释放内存的函数指针,可自定义内存函数。
# 常用接口
## 解析json 接口 | 作用 ---|--- cJSON_Parse | 字符串转json cJSON_ParseWithLength | 将部分字符串转json cJSON_Print | 格式化打印json,返回值char * cJSON_PrintUnformatted | 非格式化打印json,返回值char* cJSON_Delete | 删除json对象 cJSON_GetArraySize | 获取json对象数组成员个数 cJSON_GetArrayItem | 根据下标获取json对象 cJSON_GetObjectItem | 根据键获取值 cJSON_GetErrorPtr | 获取错误,返回值为字符串
例子 ? 使用时直接将cJSON.c与cJSON.h放入项目文件中即可 ``` #include <stdio.h> #include <cJSON.h>
int main() { ? ? #include <stdio.h> #include <cJSON.h>
int main() { ? ? char *pJsonStr = "{\"num\":2,\"students\":[{\"name\":\"lilei\",\"age\":27,\"gender\":\"man\"},{\"name\":\"hanmeimei\",\"age\":25,\"gender\":\"woman\"}]}"; ? ? cJSON *pJsonObj = NULL; ? ? cJSON *pJsonNUm = NULL; ? ? cJSON *pJsonStudents = NULL; ? ? cJSON *pJsonStudent = NULL; ? ? int iNum = 0;
? ? pJsonObj = cJSON_Parse(pJsonStr); ? ? if(!pJsonObj) ? ? { ? ? ? ? printf("error:[%s\n]",cJSON_GetErrorPtr()); ? ? ? ? return -1; ? ? }
? ? //格式化打印 ? ? printf("format print:\n%s\n",cJSON_Print(pJsonObj));
? ? //非格式化打印 ? ? printf("unformat print:\n%s\n",cJSON_PrintUnformatted(pJsonObj));
? ? //解析int ? ? pJsonNUm = cJSON_GetObjectItem(pJsonObj,"num"); ? ? //printf("%s is %lf\n",pJsonNUm->string,pJsonNUm->valuedouble); ? ? printf("%s is %d\n",pJsonNUm->string,pJsonNUm->valueint);//取整数部分 ? ? //解析数组 ? ? pJsonStudents = cJSON_GetObjectItem(pJsonObj,"students"); ? ? iNum = cJSON_GetArraySize(pJsonStudents); ? ? for(int i = 0;i < iNum; i++) ? ? { ? ? ? ? pJsonStudent = cJSON_GetArrayItem(pJsonStudents,i); ? ? ? ? printf("%s \n",cJSON_PrintUnformatted(pJsonStudent)); ? ? }
? ? //释放json ? ? cJSON_Delete(pJsonObj); ? ? return 0; } ```
## 构造json 接口 | 作用 ---|--- cJSON_CreateObject | 创建json结构 cJSON_AddItemToObject | 添加新的键值对 cJSON_AddItemToArray | 将json添加到数组 cJSON_CreateNull | 创建NULL类型的键值 cJSON_CreateTrue | 创建Ture类型的键值 cJSON_CreateFalse | 创建False类型的键值 cJSON_CreateBool | 创建BOOL类型的键值 cJSON_CreateNumber | 创建double类型的键值 cJSON_CreateString | 创建字符串类型的键值 cJSON_CreateArray | 创建数组类型的键值 cJSON_CreateObject |创建json类型的键值
例子
``` #include <stdio.h> #include <cJSON.h>
int main() { ? ? cJSON *pJsonObj = NULL; ? ? cJSON *pJsonStudents = NULL; ? ? cJSON *pJsonStudent = NULL; ? ? cJSON *pJsonStudent1 = NULL; ? ? int iNum = 0;
? ? pJsonObj = cJSON_CreateObject(); ? ? if(!pJsonObj) ? ? { ? ? ? ? printf("error:[%s\n]",cJSON_GetErrorPtr()); ? ? ? ? return -1; ? ? }
? ? cJSON_AddItemToObject(pJsonObj,"num", cJSON_CreateNumber(2)); ? ?? ? ? pJsonStudent = cJSON_CreateObject(); ? ? cJSON_AddItemToObject(pJsonStudent,"name",cJSON_CreateString("lilei")); ? ? cJSON_AddItemToObject(pJsonStudent,"age",cJSON_CreateNumber(27)); ? ? cJSON_AddItemToObject(pJsonStudent,"age",cJSON_CreateString("man"));
? ? pJsonStudent1 = cJSON_CreateObject(); ? ? cJSON_AddItemToObject(pJsonStudent1,"name",cJSON_CreateString("hanmeimei")); ? ? cJSON_AddItemToObject(pJsonStudent1,"age",cJSON_CreateNumber(25)); ? ? cJSON_AddItemToObject(pJsonStudent1,"age",cJSON_CreateString("woman"));
? ? pJsonStudents = cJSON_CreateArray(); ? ? cJSON_AddItemToArray(pJsonStudents,pJsonStudent); ? ? cJSON_AddItemToArray(pJsonStudents,pJsonStudent1);
? ? cJSON_AddItemToObject(pJsonObj,"strdents",pJsonStudents);
? ? //非格式化打印 ? ? printf("unformat print:\n%s\n",cJSON_PrintUnformatted(pJsonObj));
? ? //释放json ? ? cJSON_Delete(pJsonObj); ? ? return 0; } ```
|