c语⾔遍历json字符串,全⾯详解c语⾔使⽤cJSON解析JSON字
符
为什么选择cJSON来解析JSON字符串?因为简洁⼜简单,⽽且效率⼜快,cJSON⼯程⽂件也⾮常简单,仅⼀个.c⽂件和⼀个.h⽂件!
如果要⾃⼰写的话就是重造轮⼦了,况且效率上也不⼀定会⽐cJSON更好!
且⽂件体积⼤⼩不到30k,源代码思路也⾮常清晰,也⾮常适合研究。
当我们下载好cJSON只需要把.c和.h⽂件包含⽂件拷贝到我们⼯程⽬录下,并将头⽂件和实现⽂件包含进来就可以使⽤了!
cJSON使⽤数据结构链表的⽅式来存储js对象。
typedef struct cJSON { //cJSON结构体
struct cJSON*next,*prev; /* 遍历数组或对象链的前向或后向链表指针*/
struct cJSON *child; /*数组或对象的孩⼦节点*/
int type; /* key的类型*/
char *valuestring; /*字符串值*/
int valueint; /* 整数值*/
double valuedouble; /* 浮点数值*/
char *string; /* key的名字*/
} cJSON;
正所谓万丈⾼楼平地起,先从最简单的开始!
先来介绍四个常⽤的cJSON函数:
cJSON *cJSON_Parse(const char *value);
作⽤:将⼀个JSON数据包,按照cJSON结构体的结构序列化整个数据包,并在堆中开辟⼀块内存存储cJSON结构体
返回值:成功返回⼀个指向内存块中的cJSON的指针,失败返回NULL
cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);
作⽤:获取JSON字符串字段值
返回值:成功返回⼀个指向cJSON类型的结构体指针,失败返回NULL
char *cJSON_Print(cJSON *item);作⽤:将cJSON数据解析成JSON字符串,并在堆中开辟⼀块char*的内存空间存储JSON字符串
返回值:成功返回⼀个char*指针该指针指向位于堆中JSON字符串,失败返回NULL
void cJSON_Delete(cJSON *c);作⽤:释放位于堆中cJSON结构体内存
返回值:⽆
假如说有这样的⼀个JSON字符串
{
"test_1":"0"
"test_2":"1"
"test_3":"2"
}//json_string
这是最简单的JSON字符串
我们⾸先要先将这个字符串打包成cJSON数据格式
cJSON* cjson = cJSON_Parse(json_string);
打包后使⽤if语句或三⽬表达式判断⼀下是否将JSON字符串打包成cJSON数据格式
if(cjson == NULL){
printf("json pack into ")
}
else{//打包成功调⽤cJSON_Print打印输出
cJSON_Print(cjson);
}
然后依次获取json字符串中的每个字段的值并打印输出
//cJSON_GetObjectltem返回的是⼀个cJSON结构体所以我们可以通过函数返回结构体的⽅式选择返回类型!char* test_1_string = cJSON_GetObjectltem(cjson,"test_1")->valuestring;
char* test_2_string = cJSON_GetObjectltem(cjson,"test_2")->valuestring;
char* test_3_string = cJSON_GetObjectltem(cjson,"test_3")->valuestring;
//打印输出
printf("%s",*test_1_string);
printf("%s",*test_2_string);
printf("%s",*test_3_stiring);
最后别忘记释放内存
//delete cjson
cJSON_Delete(cjson);
cJSON_Delete(test_arr);
cJSON_Delete(arr_item);
完整代码:
#include
#include
int main(){
char* json_string =\
//⽤char* 模拟⼀个JSON字符串
"{"\
"test_1":"0"\
"test_2":"1"\
"}";
//JSON字符串到cJSON格式
cJSON* cjson = cJSON_Parse(json_string);
//判断cJSON_Parse函数返回值确定是否打包成功
if(cjson == NULL){
printf("json pack into ")
}
else{//打包成功调⽤cJSON_Print打印输出
cJSON_Print(cjson);
}
/
/获取字段值
//cJSON_GetObjectltem返回的是⼀个cJSON结构体所以我们可以通过函数返回结构体的⽅式选择返回类型!char* test_1_string = cJSON_GetObjectltem(cjson,"test_1")->valuestring;
char* test_2_string = cJSON_GetObjectltem(cjson,"test_2")->valuestring;
js获取json的key和valuechar* test_3_string = cJSON_GetObjectltem(cjson,"test_3")->valuestring;
//打印输出
printf("%s",*test_1_string);
printf("%s",*test_2_string);
printf("%s",*test_3_stiring);
//delete cjson
cJSON_Delete(cjson);
}
是不是很easy?下⾯来教⼤家如何使⽤cJSON解析数组!
{
"test_1":"1",
"test_2":"2",
"test_arr":[{
{
"test_1":"arr_1",
"test_2":"arr_2",
"test_3":"arr_3"
},
{
"test_2":"2",
"test_3":"3"
}
}],
"test_3" :"3"
}//json_arr string在开始前介绍⼀个函数
int cJSON_GetArraySize(cJSON *array);作⽤:获取数组成员对象个数
返回值:数组成员对象个数
⾸先第⼀步打包
cJSON* cjson = cJSON_Parse(json_arr_string);第⼆步判断打包是否成功
if(cjson == NULL){
printf("json pack into ")
}
else{//打包成功调⽤cJSON_Print打印输出
cJSON_Print(cjson);
}第三步获取数组对象
cJSON* test_arr = cJSON_GetObjectltem(cjson,"test_arr");第四步获取数组对象个数便于循环
int arr_size = cJSON_GetArraySize(test_arr);//return arr_size 2第五步获取test_arr数组对象孩⼦节点cJSON* arr_item = test_arr->child;//⼦对象第六步循环获取数组下每个字段的值并使⽤cJSON_Print打印:for(int i = 0;i <=(arr_size-1)/*0*/;++i){
cJSON_Print(cJSON_GetObjectItem(arr_item,"test_1"));
cJSON_Print(cJSON_GetObjectItem(arr_item,"test_2"));
cJSON_Print(cJSON_GetObjectItem(arr_item,"test_3"));
arr_item = arr_item->next;//下⼀个⼦对象
}最后别忘记释放
cJSON_Delete(cjson);
cJSON_Delete(test_arr);
cJSON_Delete(arr_item);完整代码:
#include
#include
int main(){
char* json_string =\
//⽤char* 模拟⼀个JSON字符串
“{”,\
"test_1":"1",\
"test_2":"2",\
"test_arr":"[{",\
"{",\
"test_1":"arr_1",\
"test_2":"arr_2",\
"test_3":"arr_3",\
"}",\
"{"\
"test_1":"1",\
"test_2":"2",\
"test_3":"3",\
"}",\
"}]",\
"test_3" :"3",\
"}"//json_arr string;
//第⼀步打包JSON字符串
cJSON* cjson = cJSON_Parse(json_arr_string);
//判断是否打包成功
if(cjson == NULL){
printf("json pack into cjson error…")
}
else{//打包成功调⽤cJSON_Print打印输出
cJSON_Print(cjson);
}
//获取数组对象
cJSON* test_arr = cJSON_GetObjectltem(cjson,"test_arr");
//获取数组对象个数便于循环
int arr_size = cJSON_GetArraySize(test_arr);//return arr_size 2 //获取test_arr数组对象孩⼦节点
cJSON* arr_item = test_arr->child;//⼦对象
//循环获取数组下每个字段的值并使⽤cJSON_Print打印
for(int i = 0;i <=(arr_size-1)/*0*/;++i){
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论