DSP

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

2019-07-13 17:43发布

一、前言:
为了使用简单方便,可以通过下载cJSON文件来解析JOSN字符串比较简单方便,而且cJSON文件只有一个cJSON.c和cJSON.h两个文件,使用起来效率比较高。 二、cJSON文件源码下载:
链接:https://pan.baidu.com/s/1hZl12FqMJsfxkocU2ULBTg 密码:xi67 三、使用说明:将下载到的文件解压出来,里面只有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 ", 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 ", ret->valueint);//打印出来的结果是-1
ret = cJSON_GetObjectItem(json, "num_1");//在josn结构体中查找"num_1"
printf("%d ", ret->valueint);//打印出来的结果是0
ret = cJSON_GetObjectItem(json, "num_2");//在josn结构体中查找"num_2"
printf("%d ", ret->valueint);//打印出来的结果是1
ret = cJSON_GetObjectItem(json, "string");//在josn结构体中查找"string"
printf("%s ", ret->valuestring);//打印出来的结果是str
ret = cJSON_GetObjectItem(json, "string_1");//在josn结构体中查找"string_1"
printf("%s ", ret->valuestring);//打印出来的结果是abcd
ret = cJSON_GetObjectItem(json, "string_2");//在josn结构体中查找"string_2"
printf("%s ", ret->valuestring);//打印出来的结果是123abc123
/
-------------------------------解析"json" end-----------------------
/
json = cJSON_GetObjectItem(root, "string");//在root结构体中查找"string"
printf("%s ", ret->valuestring);//打印出来的结果是str
ret = cJSON_GetObjectItem(root, "num");//在root结构体中查找"num"
printf("%d ", ret->valueint);//打印出来的结果是2
/******************************解析cJSON end**************************/
cJSON_Delete(root);//释放总的cJSON结构体只需要释放cJSON_Parse函数创建的cJOSN结构体即可
4.解析JSON结构体数组:
再多用到两个函数:
int cJSON_GetArraySize(cJSON array);//获取JSON数组的大小
cJSON
cJSON_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 ", ret->valueint);//打印出来的结果为:0
ret = cJSON_GetObjectItem(json, "string_0");//在josn结构体中查找"string_0"
printf("%s ", ret->valuestring);//打印出来的结果为:str0
/-------------------------1 end-------------------------------/
/-------------------------2------------------------------------/
json= cJSON_GetArrayItem(arr, 1);//获取数组第2个成员
ret = cJSON_GetObjectItem(json, "num_1");//在josn结构体中查找"num_1"
printf("%d ", ret->valueint);//打印出来的结果为:1
ret = cJSON_GetObjectItem(json, "string_1");//在josn结构体中查找"string_1"
printf("%s ", ret->valuestring);//打印出来的结果为:str1
/-------------------------2 end-------------------------------/
/-------------------------3------------------------------------/
json= cJSON_GetArrayItem(arr, 2);//获取数组第3个成员
ret = cJSON_GetObjectItem(json, "num_2");//在josn结构体中查找"num_1"
printf("%d ", ret->valueint);//打印出来的结果为:2
ret = cJSON_GetObjectItem(json, "string_2");//在josn结构体中查找"string_2"
printf("%s ", 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 ", out);//打印结果如下:
{
"key": "value"
}
/**********使用完需要释放空间**************/
free(out);//释放malloc分配的空间
/***********************************************/
out = cJSON_PrintUnformatted(root);//将cJSON结构体转换为字符串(不带格式)不进行换行和空格
printf("%s ", 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 ", 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 ", 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 ", 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个成员,每删除一个下标,数组整体会往前移,建议从后面往前面遍历删除。  

作者:only_cherry
链接:https://www.jianshu.com/p/653090441524
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。