简介
安装
cJSON提供了多种安装方式
基础
- 数据类型
cJSON使用cJSON结构数据类型表示JSON数据,数据类型如下
1.cJOSN结构体为一个双向列表,并可通过child指针访问下一层。/* The cJSON structure: */ typedef struct cJSON { struct cJSON *next; struct cJSON *prev; struct cJSON *child; int type; char *valuestring; /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */ int valueint; double valuedouble; char *string; } cJSON;
2.type变量决定数据项类型(值的类型),数据项可以是字符串可以是整形,也可以是浮点型。如果是整形值的话可从valueint,如果是浮点型的话可从valuedouble取出,以此类推。
3.string可理解为节点的名称,即为键
- json打印
cJSON提供了格式化打印json的方法:cJSON_Print()
非格式化输出:printf("%s\n",cJSON_Print(root));
cJSON_PrintUnformatted()
printf("%s\n",cJSON_PrintUnformatted(root));
- 判断json类型
判断json类型cJSON提供了cJSON_IsXXXX()
方法,如数组即为cJSON_IsArray()
,Object即为cJSON_IsObject()
,数值即为cJSON_IsNumber()
以此类推if (!cJSON_IsArray(root)){ printf("no Array\n"); return -1; }
- 释放
使用cJSON_Delete()
方法进行释放
生成JSON
- 创建
对于每种值类型,都有一个cJSON_Create...
函数可用于创建该类型的项目。如创建空值cJSON_CreateNull
创建布尔cJSON_CreateTrue
、cJSON_CreateFalse
和cJSON_CreateBool
,以此类推 - object转JSON
创建一个空对象可以使用cJSON_CreateObject()
方法,要添加到对象则使用cJSON_AddItemToObject()
方法int main(){ cJSON *root = cJSON_CreateObject(); cJSON *name = cJSON_CreateString("Tom"); cJSON *age = cJSON_CreateNumber(20); cJSON_AddItemToObject(root,"name",name); cJSON_AddItemToObject(root,"age",age); printf("%s\n",cJSON_PrintUnformatted(root)); cJSON_Delete(root); return 0; }
- Array转JSON
创建数组使用cJSON_CreateArray()
方法,将项目添加到数组则使用cJSON_AddItemToArray()
方法追加到末尾int main(){ cJSON *root = cJSON_CreateArray(); cJSON *item; cJSON *name; cJSON *age; for (int i = 0; i < 3; ++i) { item = cJSON_CreateObject(); name = cJSON_CreateString("Tom"); age = cJSON_CreateNumber(20); cJSON_AddItemToObject(item,"name",name); cJSON_AddItemToObject(item,"age",age); cJSON_AddItemToArray(root,item); } printf("%s\n",cJSON_PrintUnformatted(root)); printf("%s\n",cJSON_Print(root)); cJSON_Delete(root); return 0; }
解析JSON
- 解析Object
char text[]="{\"name\":\"Tom\",\"age\":18}"; cJSON * root = cJSON_Parse(text); if(!root) { printf("no json\n"); return -1; } //name cJSON *name = cJSON_GetObjectItem(root, "name"); if (!name) { printf("no name!\n"); return -1; } else{ printf("%s\n",name->valuestring); } //age cJSON *age = cJSON_GetObjectItem(root, "age"); if (!age) { printf("no age!\n"); return -1; } else{ printf("%d\n",age->valueint); } cJSON_Delete(root);
- 解析Array
int main(){ char text[]="[{\"name\":\"Tom1\",\"age\":18},{\"name\":\"Tom2\",\"age\":19},{\"name\":\"Tom3\",\"age\":20},{\"name\":\"Tom4\",\"age\":21}]"; cJSON * root = cJSON_Parse(text); if(!root) { printf("no json\n"); return -1; } if (!cJSON_IsArray(root)){ printf("no Array\n"); return -1; } //数组长度 int array_size = cJSON_GetArraySize(root); cJSON *item; cJSON *name; cJSON *age; for(int i=0; i< array_size; i++) { item = cJSON_GetArrayItem(root, i); name = cJSON_GetObjectItem(item, "name"); if (!name) { printf("no name!\n"); return -1; } printf("%s\t",name->valuestring); age = cJSON_GetObjectItem(item, "age"); if (!age) { printf("no age!\n"); return -1; } printf("%d\n",age->valueint); } return 0; } cJSON_Delete(root);