1,json结构的定义
typedef struct cJSON { //cJSON结构体
struct cJSON*next,*prev; /* 遍历数组或对象链的前向或后向链表指针*/
struct cJSON *child; /*数组或对象的孩子节点*/
int type; /* key的类型*/
char *valuestring; /*字符串值*/
int valueint; /* 整数值*/
double valuedouble; /* 浮点数值*/
char *string; /* key的名字*/
} cJSON;
2,json常用函数说明
(1)定义一个JSON数据包,按照cJSON结构体的结构序列化整个数据包,并在堆中申请空间,返回值是成功返回一个指向内存块中的cJSON的指针,失败返回NULL
cJSON *cJSON_Parse(const char *value);
(2)获取JSON字符串字段值
cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);
(3)向对象中增加(字符)节点
cJSON_AddStringToObject(root,"名称","字符串");
(4) 向对象中增加对象(字符串、数组、数字)
cJSON_AddStringToObject(pJsonRoot, "hello", "hello world"); //添加字符串
cJSON_AddNumberToObject(pJsonRoot, "number", 10010);//添加数字
cJSON_AddBoolToObject(pJsonRoot, "bool", 1);//添加bool值
cJSON_AddItemToObject(root,"名称",cJSON_CreateString("邝东宇")) ; //添加对象
cJSON_AddItemToObject(root,"名称",cJSON_CreateNumber(100)) ;
(5)获取数组成员对象个数
int cJSON_GetArraySize(cJSON *array);
(6)获取数组元素
cJSON* tmp=cJSON_GetArrayItem(array,1); //下标从0开始
3,函数应用举例:
将下面的数据用json解析打印出来:
{
"name": "hello world",
"number": 10010,
"bool": true,
"subobj": {
"level": "middle"
}
}
分析:
obj_1 : hello world
obj_2 : 10010
obj_3 : 1
sub_obj_1 : middle
代码如下:
#include
#include "cJSON.h"
char * makeJson()
{
cJSON * pJsonRoot = NULL;
pJsonRoot = cJSON_CreateObject();
if(NULL == pJsonRoot)
{
//error happend here
return NULL;
}
cJSON_AddStringToObject(pJsonRoot, "name", "hello world");
cJSON_AddNumberToObject(pJsonRoot, "number", 10010);
cJSON_AddBoolToObject(pJsonRoot, "bool", 1);
cJSON * pSubJson = NULL;
pSubJson = cJSON_CreateObject();
if(NULL == pSubJson)
{
// create object faild, exit
cJSON_Delete(pJsonRoot);
return NULL;
}
cJSON_AddStringToObject(pSubJson, "level", "middle");
cJSON_AddItemToObject(pJsonRoot, "subobj", pSubJson);
char * p = cJSON_Print(pJsonRoot);
// else use :
// char * p = cJSON_PrintUnformatted(pJsonRoot);
if(NULL == p)
{
//convert json list to string faild, exit
//because sub json pSubJson han been add to pJsonRoot, so just delete pJsonRoot, if you also delete pSubJson, it will coredump, and error is : double free
cJSON_Delete(pJsonRoot);
return NULL;
}
//free(p);
cJSON_Delete(pJsonRoot);
return p;
}
void parseJson(char * pMsg)
{
if(NULL == pMsg)
{
return;
}
cJSON * pJson = cJSON_Parse(pMsg);
if(NULL == pJson)
{
// parse faild, return
return ;
}
// get string from json
cJSON * pSub = cJSON_GetObjectItem(pJson, "name");
if(NULL == pSub)
{
//get object named "hello" faild
}
printf("obj_1 : %s\n", pSub->valuestring);
// get number from json
pSub = cJSON_GetObjectItem(pJson, "number");
if(NULL == pSub)
{
//get number from json faild
}
printf("obj_2 : %d\n", pSub->valueint);
// get bool from json
pSub = cJSON_GetObjectItem(pJson, "bool");
if(NULL == pSub)
{
// get bool from json faild
}
printf("obj_3 : %d\n", pSub->valueint);
// get sub object
pSub = cJSON_GetObjectItem(pJson, "subobj");
if(NULL == pSub)
{
// get sub object faild
}
cJSON * pSubSub = cJSON_GetObjectItem(pSub, "level");
if(NULL == pSubSub)
{
// get object from subject object faild
}
printf("sub_obj_1 : %s\n", pSubSub->valuestring);
cJSON_Delete(pJson);
}
int main()
{
char * p = makeJson();
if(NULL == p)
{
return 0;
}
printf("%s\n", p);
parseJson(p);
free(p); //千万不要忘记释放内存呀,cJSON_Print()函数或者cJSON_PrintUnformatted()产生的内存,使用free(char *)进行释放
return 0;
}