cjson构建_利用cJSON解析和创建JSON字符串

一、前言:

为了使用简单方便,可以通过下载cJSON文件来解析JOSN字符串比较简单方便,而且cJSON文件只有一个cJSON.c和cJSON.h两个文件,使用起来效率比较高。

三、使用说明:将下载到的文件解压出来,里面只有cJSON.c、cJSON.h两个文件,把其拷贝到工程项目文件中编译使用即可。

四、解析JOSN字符串:

使用例子:

解析一个简单的键值对字符串:

{

"key": "value"

}

其中字符串中健为key,值为value。

在cJSON.h中有为cJSON的结构体和和三个函数:

typedef struct cJSON {

struct cJSONnext,prev; /* 遍历数组或对象链的前向或后向链表指针*/

struct cJSON child; /数组或对象的孩子节点 /

int type; / key的类型 */

char valuestring; /字符串值 /

int valueint; / 整数值 /

double valuedouble; / 浮点数值 */

char string; / key的名字 */

} cJSON;

cJSON *cJSON_Parse(const char *value); //将JSON字符串转换成cJSON结构体

cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);//在cJSON结构体中查找某个键的名称(key)

void cJSON_Delete(cJSON *c);//释放cJSON结构体指针

使用如下:

char *str = "{"key":"value"}";// 花括号里面的(")前面必须加(),将其转换为转义字符,以免和c语言字符串冲突

char *root = NULL, *ret = NULL;

root = cJSON_Parse(str);//将cJSON字符串转换为cJSON结构体指针

ret = cJSON_GetObjectItem(root, "key");//在root结构体中查找"key"这个键(一个字符串),成功返回一个cJSON结构体,失败返回NULL。

printf("%s\n", ret->valuestring);//打印出来的结果是value

cJSON_Delete(root);//释放cJSON结构体

3.解析复杂一点的cJSON结构体:

{

"json": {

"num": -1,

"num_1": 0,

"num_2": 1,

"string": "str",

"string_1": "abcd",

"string_2": "123abc123"

},

"string": "str",

"num": 2

}

同样使用上面那三个函数搞定:

/******************************解析cJSON**************************/

char str = "{"json": {"num": -1,"num_1": 0,"num_2": 1,"string": "str","string_1": "abcd","string_2": "123abc123"},"string": "str","num": 2}";

char root = NULL, ret = NULL, json = NULL;//定义三个cJOSN结构体指针

root = cJSON_Parse(str);//将cJSON字符串转换为cJSON结构体指针

json = cJSON_GetObjectItem(root, "json");//在root结构体中查找"josn"

/--------------------------解析"json"---------------------------/

ret = cJSON_GetObjectItem(json, "num");//在josn结构体中查找"num"

printf("%d\n", ret->valueint);//打印出来的结果是-1

ret = cJSON_GetObjectItem(json, "num_1");//在josn结构体中查找"num_1"

printf("%d\n", ret->valueint);//打印出来的结果是0

ret = cJSON_GetObjectItem(json, "num_2");//在josn结构体中查找"num_2"

printf("%d\n", ret->valueint);//打印出来的结果是1

ret = cJSON_GetObjectItem(json, "string");//在josn结构体中查找"string"

printf("%s\n", ret->valuestring);//打印出来的结果是str

ret = cJSON_GetObjectItem(json, "string_1");//在josn结构体中查找"string_1"

printf("%s\n", ret->valuestring);//打印出来的结果是abcd

ret = cJSON_GetObjectItem(json, "string_2");//在josn结构体中查找"string_2"

printf("%s\n", ret->valuestring);//打印出来的结果是123abc123

/-------------------------------解析"json" end-----------------------/

json = cJSON_GetObjectItem(root, "string");//在root结构体中查找"string"

printf("%s\n", ret->valuestring);//打印出来的结果是str

ret = cJSON_GetObjectItem(root, "num");//在root结构体中查找"num"

printf("%d\n", ret->valueint);//打印出来的结果是2

/******************************解析cJSON end**************************/

cJSON_Delete(root);//释放总的cJSON结构体只需要释放cJSON_Parse函数创建的cJOSN结构体即可

4.解析JSON结构体数组:

再多用到两个函数:

int cJSON_GetArraySize(cJSON array);//获取JSON数组的大小

cJSONcJSON_GetArrayItem(cJSON *array,int item); //获取数组下标的成员

解析复杂更一点的JSON结构体和JSON结构体:

{

"array": [{

"num_0": 0,

"string_0": "str0"

},

{

"num_1": 1,

"string_1": "str1"

},

{

"num_2": 2,

"string_2": "str2"

}

]

}

char *str = "{"array": [{"num_0": 0,"string_0": "str0"},{"num_1": 1,"string_1": "str1"},{"num_2": 2,"string_2": "str2"}]}";

char *root = NULL, *ret = NULL, *arr = NULL, *json = NULL;//定义4个cJOSN结构体指针

int size = 0;//用于存储数组大小

/******************************解析cJSON**************************/

root = cJSON_Parse(str);//将cJSON字符串转换为cJSON结构体指针

arr= cJSON_GetObjectItem(root, "array");//在root结构体中查找"array"

size = cJSON_GetArraySize(arr);//此时size值为3

/-------------------------1------------------------------------/

json= cJSON_GetArrayItem(arr, 0);//获取数组第1个成员

ret = cJSON_GetObjectItem(json, "num_0");//在josn结构体中查找"num_0"

printf("%d\n", ret->valueint);//打印出来的结果为:0

ret = cJSON_GetObjectItem(json, "string_0");//在josn结构体中查找"string_0"

printf("%s\n", ret->valuestring);//打印出来的结果为:str0

/-------------------------1 end-------------------------------/

/-------------------------2------------------------------------/

json= cJSON_GetArrayItem(arr, 1);//获取数组第2个成员

ret = cJSON_GetObjectItem(json, "num_1");//在josn结构体中查找"num_1"

printf("%d\n", ret->valueint);//打印出来的结果为:1

ret = cJSON_GetObjectItem(json, "string_1");//在josn结构体中查找"string_1"

printf("%s\n", ret->valuestring);//打印出来的结果为:str1

/-------------------------2 end-------------------------------/

/-------------------------3------------------------------------/

json= cJSON_GetArrayItem(arr, 2);//获取数组第3个成员

ret = cJSON_GetObjectItem(json, "num_2");//在josn结构体中查找"num_1"

printf("%d\n", ret->valueint);//打印出来的结果为:2

ret = cJSON_GetObjectItem(json, "string_2");//在josn结构体中查找"string_2"

printf("%s\n", ret->valuestring);//打印出来的结果为:str2

/-------------------------3 end-------------------------------/

cJSON_Delete(root);//释放cJSON结构体

/******************************解析cJSON end**************************/

五、创建JOSN字符串:

1.创建json字符串需要用到一下几个函数:

extern cJSON *cJSON_CreateObject(void);//创建一个cJSON结构体指针,并给其分配空间

cJSON_AddNumberToObject(object,name,n)//这是一个宏函数,创建一个整形健值对。

cJSON_AddStringToObject(object,name,s)//这是一个宏函数,创建一个字符串类型健值对。

extern char *cJSON_Print(cJSON *item);//将cJSON结构体转换为cJSON字符串(带格式)增加一些换行和空格

extern char *cJSON_PrintUnformatted(cJSON item);//将cJSON结构体转换为cJSON字符串(不带格式)不进行换行和空格

1.例子:比如我们要创建{"key": "value"}一个这样的JSON字符串,需要一下几步:

/========================创建开始===========================/

cJSON root = NULL;

char out = NULL;

root = cJSON_CreateObject();//创建一个cJSON结构体指针并分配空间,然后赋值给root

cJSON_AddStringToObject(root, "key", "value");//在root结构体中创建一个健为"key",值为" value"的键值对

out = cJSON_Print(root);//将cJSON结构体转换为字符串(带格式)增加一些换行和空格

printf("%s\n", out);//打印结果如下:

{

"key": "value"

}

/**********使用完需要释放空间**************/

free(out);//释放malloc分配的空间

/***********************************************/

out = cJSON_PrintUnformatted(root);//将cJSON结构体转换为字符串(不带格式)不进行换行和空格

printf("%s\n", out);//打印结果如下:

{"key": "value"}

/**********使用完需要释放空间**************/

free(out);//释放malloc分配的空间

cJSON_Delete(root );//释放cJSON结构体指针

/***********************************************/

/========================创建结束=========================/

2.创建一个稍微复杂一点的json字符串:

{

"json": {

"num": -1,

"num_1": 0,

"num_2": 1,

"string": "str",

"string_1": "abcd",

"string_2": "123abc123"

},

"string": "str",

"num": 2

}

需要增加一个函数:

extern void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item);//在cJSON结构体里面创建cJSON结构体

/************************************创建开始*****************************************/

cJSON *root = NULL, *json = NULL;

root = cJSON_CreateObject();//创建一个cJSON结构体指针并分配空间,然后赋值给root

cJSON_AddItemToObject(root, "json", json = cJSON_CreateObject());//在root结构体中创建一个健为"json",值为json结构体的键值对

cJSON_AddNumberToObject(json , "num", -1);//在json 结构体中创建一个健为"num",值为 -1的键值对

cJSON_AddNumberToObject(json , "num_1", 0);//在json 结构体中创建一个健为"num_1",值为 0的键值对

cJSON_AddNumberToObject(json , "num_2",1);//同上

cJSON_AddStringToObject(json , "string", "str");//在json 结构体中创建一个健为"string",值为" str"的键值对

cJSON_AddStringToObject(json , "string_1", "abcd");//同上

cJSON_AddStringToObject(json , "string_2", "123abc123");//同上

cJSON_AddStringToObject(root, "string", "str");//在root结构体中创建一个健为"string",值为" str"的键值对

cJSON_AddNumberToObject(root, "num", 2);//在root结构体中创建一个健为"num",值为 2的键值对

out = cJSON_Print(root);//将cJSON结构体转换为字符串(带格式)增加一些换行和空格

printf("%s\n", out);//打印结果如下:

{

"json": {

"num": -1,

"num_1": 0,

"num_2": 1,

"string": "str",

"string_1": "abcd",

"string_2": "123abc123"

},

"string": "str",

"num": 2

}

/**********使用完需要释放空间**************/

free(out);//释放malloc分配的空间

/***********************************************/

out = cJSON_PrintUnformatted(root);//将cJSON结构体转换为字符串(不带格式)不进行换行和空格

printf("%s\n", out);//打印结果如下:

{"json": {"num": -1,"num_1": 0,"num_2": 1,"string": "str","string_1": "abcd","string_2": "123abc123"},"string": "str","num": 2}

/**********使用完需要释放空间**************/

free(out);//释放malloc分配的空间

cJSON_Delete(root );//释放cJSON结构体指针

/***********************************************/

/========================创建结束=========================/

3.最后再来创建一个数组:

{

"array": [{

"num_0": 0,

"string_0": "str0"

},

{

"num_1": 1,

"string_1": "str1"

},

{

"num_2": 2,

"string_2": "str2"

}

]

}

需要增加两个个函数:

extern cJSON *cJSON_CreateArray(void);//创建一个cJSON结构体数组

extern void cJSON_AddItemToArray(cJSON *array, cJSON *item);//在cJSON结构体中增加cJSON结构体数组

/************************************创建数组开始*************************************/

cJSON *root = NULL, *arr = NULL, *jsonr = NULL;

char *out = NULL;

root = cJSON_CreateObject();

cJSON_AddItemToObject(root, "array", arr = cJSON_CreateArray());//在root结构体中创建一个健为"array",值为arr结构体数组的键值对

/************************添加数组第一个成员开始************************************/

json = cJSON_CreateObject();

cJSON_AddNumberToObject(json , "num_0", 0);//在json 结构体中创建一个健为"num_0",值为 0的键值对

cJSON_AddStringToObject(json , "string_0", "str0");//在json 结构体中创建一个健为"string_0",值为 "str0"的键值对

cJSON_AddItemToArray(arr, json);//将json结构体加入到arr数组中

/************************添加数组第一个成员结束************************************/

/************************添加数组第二个成员开始************************************/

json = cJSON_CreateObject();

cJSON_AddNumberToObject(json , "num_1", 1);

cJSON_AddStringToObject(json , "string_1", "str1");

cJSON_AddItemToArray(arr, json);

/************************添加数组第二个成员结束************************************/

/************************添加数组第三个成员开始************************************/

json = cJSON_CreateObject();

cJSON_AddNumberToObject(json , "num_2", 2);

cJSON_AddStringToObject(json , "string_2", "str2");

cJSON_AddItemToArray(arr, json);

/************************添加数组第三个成员结束************************************/

out = cJSON_Print(root);

printf("%s\n", out);//打印结果如下:

{

"array": [{

"num_0": 0,

"string_0": "str0"

},

{

"num_1": 1,

"string_1": "str1"

},

{

"num_2": 2,

"string_2": "str2"

}

]

}

free(out);//释放malloc分配的空间

cJSON_Delete(root );//释放cJSON结构体指针

/************************************创建数组结束*************************************/

六、删除JSON键值对或数组:

由于删除比较简单,不举例说明。简单介绍一下用到的两个函数两个函数:

extern void cJSON_DeleteItemFromObject(cJSON *object,const char *string);//从cJSON结构体中删除一个键值对

extern void cJSON_DeleteItemFromArray(cJSON *array,int which);//从cJSON结构体数组中删除一个数组下标成员

注意:假如数组里面10个成员,每删除一个下标,数组整体会往前移,建议从后面往前面遍历删除。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值