C语言怎么用cJSON解析JSON格式
这篇文章主要介绍“C语言怎么用cJSON解析JSON格式”,在日常操作中,相信很多人在C语言怎么用cJSON解析JSON格式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言怎么用cJSON解析JSON格式”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
一、JSON格式
语法:键 / 值
1、以 { 开始,以 } 结束,允许嵌套使用
2、每个键和值成对出现,并使用:分隔。如"age"=23
3、键值对之间用 ,分隔
值的多种类型:
字符串:用 " "
{"name":"code","gender":"male"}
数字:整数或浮点数都直接表示
{"key1":10,"key2":20.0}
数组:用[ ]
{"key1":[0,1],"key2":[2,3]}
布尔值:fault、true
二、cJSON下载
gitclonegitee/peng-jiaweibabe/c-json.git
cJSON的.c和.h文件,使用的时候,只需要将这两个文件复制到工程目录,然后包含头文件cJSON.h即可。即#include "cJSON.h"
如若出现该情况,链接math库即可
三、cJSON常用函数接口
1.cJSON_Parse
CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value)
函数功能:将一个JSON字符串,按照cJSON结构体的结构序列化整个数据包,并在堆中开辟一块内存存储cJSON结构体
返回值:成功返回一个指向内存块中的cJSON的指针,失败返回NULL
2.cJSON_Print
CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item)//按JSON格式打印
CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item)//不按JSON格式打印
函数功能:将整条链表中存放的JSON信息输出到一个字符串中,使用时只需用一个字符串指针(char *)接收该函数返回的指针地址即可。
返回值:成功返回一个char*指针并指向位于堆中JSON字符串,失败返回NULL
3.cJSON_Delete
CJSON_PUBLIC(void) cJSON_Delete(cJSON *c)
函数功能:释放位于堆中cJSON结构体内存
返回值:无
4.cJSON_GetObjectItem
(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string)
函数功能:根据键值对的名称从链表中取出对应的值,返回该键值对(链表节点)的地址
返回值:成功返回一个指向内存块中的cJSON的指针,失败返回NULL
5.cJSON_GetObjectItem(数组相关)
CJSON_PUBLIC(cJSON*)cJSON_GetObjectItem(constcJSON*constobject,constchar*conststring)(int)cJSON_GetArraySize(constcJSON*array)(cJSON*)cJSON_GetArrayItem(constcJSON*array,intindex)
6.创建对象函数接口
/*rawjson*/CJSON_PUBLIC(cJSON*)cJSON_CreateRaw(constchar*raw);CJSON_PUBLIC(cJSON*)cJSON_CreateArray(void);CJSON_PUBLIC(cJSON*)cJSON_CreateObject(void);/*ThesecallscreateacJSONitemoftheappropriatetype.*/CJSON_PUBLIC(cJSON*)cJSON_CreateNull(void);CJSON_PUBLIC(cJSON*)cJSON_CreateTrue(void);CJSON_PUBLIC(cJSON*)cJSON_CreateFalse(void);CJSON_PUBLIC(cJSON*)cJSON_CreateBool(cJSON_boolboolean);CJSON_PUBLIC(cJSON*)cJSON_CreateNumber(doublenum);CJSON_PUBLIC(cJSON*)cJSON_CreateString(constchar*string);/*TheseutilitiescreateanArrayofcountitems.*/CJSON_PUBLIC(cJSON*)cJSON_CreateIntArray(constint*numbers,intcount);CJSON_PUBLIC(cJSON*)cJSON_CreateFloatArray(constfloat*numbers,intcount);CJSON_PUBLIC(cJSON*)cJSON_CreateDoubleArray(constdouble*numbers,intcount);CJSON_PUBLIC(cJSON*)cJSON_CreateStringArray(constchar**strings,intcount);
7.添加cJSON对象到链表
CJSON_PUBLIC(void)cJSON_AddItemToArray(cJSON*array,cJSON*item);CJSON_PUBLIC(void)cJSON_AddItemToObject(cJSON*object,constchar*string,cJSON*item);
8.从现有的cJSON链表中删除一个对象
CJSON_PUBLIC(cJSON*)cJSON_DetachItemViaPointer(cJSON*parent,cJSON*constitem);CJSON_PUBLIC(cJSON*)cJSON_DetachItemFromArray(cJSON*array,intwhich);CJSON_PUBLIC(void)cJSON_DeleteItemFromArray(cJSON*array,intwhich);CJSON_PUBLIC(cJSON*)cJSON_DetachItemFromObject(cJSON*object,constchar*string);CJSON_PUBLIC(cJSON*)cJSON_DetachItemFromObjectCaseSensitive(cJSON*object,constchar*string);CJSON_PUBLIC(void)cJSON_DeleteItemFromObject(cJSON*object,constchar*string);CJSON_PUBLIC(void)cJSON_DeleteItemFromObjectCaseSensitive(cJSON*object,constchar*string);
四、cJSON解析JSON案例
1.一层键值
/**********************************************************************************Copyright:(C)2023Nbiot<lingyun@gail>*Allrightsreserved.**Filename:test_cjson.c*Description:Thisfiletest_cjson.c**Version:1.0.0(30/05/22)*Author:Nbiot<lingyun@gail>*ChangeLog:1,Releaseinitialversionon"30/05/2220:25:49"*********************************************************************************/#include<stdio.h>#include<string.h>#include"cJSON.h"intmain(intargc,char**argv){charjson_buf[]="{\"type\":\"text\",\"number\":1111,\"sms\":\"nihao\"}";cJSON*json=NULL;cJSON*json_type=NULL;cJSON*json_num=NULL;cJSON*json_sms=NULL;printf("json格式化前:\n");printf("%s\n\n",json_buf);json=cJSON_Parse(json_buf);//json格式序列化if(NULL==json){printf("cJSON_Parseerror:%s\n",cJSON_GetErrorPtr());}printf("json格式化后:\n");printf("%s\n\n",cJSON_Print(json));/*获取相应key的value*/json_type=cJSON_GetObjectItem(json,"type");json_num=cJSON_GetObjectItem(json,"number");json_sms=cJSON_GetObjectItem(json,"sms");printf("type:%s\n",json_type->valuestring);printf("number:%d\n",json_num->valueint);printf("sms:%s\n",json_sms->valuestring);cJSON_Delete(json);//释放cjson结构体内存return0;}
结果:
2.多层键值(两次为例)
/**********************************************************************************Copyright:(C)2023Nbiot<lingyun@gail>*Allrightsreserved.**Filename:test_cjson1.c*Description:Thisfiletest_cjson1.c**Version:1.0.0(30/05/22)*Author:Nbiot<lingyun@gail>*ChangeLog:1,Releaseinitialversionon"30/05/2223:36:09"*********************************************************************************/#include<stdio.h>#include<string.h>#include"cJSON.h"intmain(intargc,char**argv){charjson_buf[]="{\"type\":\"text\",\"number\":{\"phone_number\":\"17687499242\"},\"sms\":\"nihao\"}";cJSON*json=NULL;cJSON*json_phone_number=NULL;printf("json格式化前:\n");printf("%s\n\n",json_buf);json=cJSON_Parse(json_buf);//json格式序列化if(NULL==json){printf("cJSON_Parseerror:%s\n",cJSON_GetErrorPtr());}printf("json格式化后:\n");printf("%s\n\n",cJSON_Print(json));/*获取相应key的value*/json_phone_number=cJSON_GetObjectItem(json,"number");//首先获取第一次键值json_phone_number=cJSON_GetObjectItem(json_phone_number,"phone_number");//获取第二层printf("phone_number:%s\n",json_phone_number->valuestring);cJSON_Delete(json);//释放cjson结构体内存return0;}
结果:
3.json数组解析
/**********************************************************************************Copyright:(C)2023Nbiot<lingyun@gail>*Allrightsreserved.**Filename:test_cjson3.c*Description:Thisfiletest_cjson3.c**Version:1.0.0(31/05/22)*Author:Nbiot<lingyun@gail>*ChangeLog:1,Releaseinitialversionon"31/05/2200:14:13"*********************************************************************************/#include<stdio.h>#include<string.h>#include"cJSON.h"intmain(intargc,char**argv){charjson_buf[]="{\"type\":\"text\",\"number\":1111,\"sms\":\"nihao\",\"array\":[1,2,3]}";cJSON*json=NULL;cJSON*json_array=NULL;intarray_size=0;cJSON*json_array_value=NULL;printf("json格式化前:\n");printf("%s\n\n",json_buf);json=cJSON_Parse(json_buf);//json格式序列化if(NULL==json){printf("cJSON_Parseerror:%s\n",cJSON_GetErrorPtr());}printf("json格式化后:\n");printf("%s\n\n",cJSON_Print(json));json_array=cJSON_GetObjectItem(json,"array");array_size=cJSON_GetArraySize(json_array);//获取数组大小printf("array_size=%d\n",array_size);for(inti=0;i<array_size;i++){json_array_value=cJSON_GetArrayItem(json_array,i);printf("array[%d]=%d\n",i,json_array_value->valueint);}cJSON_Delete(json);//释放cjson结构体内存return0;}
结果:
五、JSON添加数据 (与链表类似)
三层键值
/**********************************************************************************Copyright:(C)2023Nbiot<lingyun@gail>*Allrightsreserved.**Filename:test_cjson2.c*Description:Thisfiletest_cjson2.c**Version:1.0.0(30/05/22)*Author:Nbiot<lingyun@gail>*ChangeLog:1,Releaseinitialversionon"30/05/2220:46:57"*********************************************************************************/#include<stdio.h>#include<stdlib.h>#include"cJSON.h"intmain(intargc,char**argv){char*json_ptr=NULL;cJSON*root=cJSON_CreateObject();cJSON*son=cJSON_CreateObject();cJSON*next=cJSON_CreateObject();cJSON_AddItemToObject(root,"gender",cJSON_CreateString("male"));cJSON_AddItemToObject(root,"student",son);//第一层嵌套键值cJSON_AddItemToObject(son,"name",cJSON_CreateString("xiaochen"));//第二层嵌套键值cJSON_AddItemToObject(son,"school",next);//第二层嵌套键值cJSON_AddItemToObject(next,"name",cJSON_CreateString("highschool"));//第三层嵌套键值json_ptr=cJSON_Print(root);printf("JSON:\n",json_ptr);printf("%s\n",json_ptr);free(json_ptr);cJSON_Delete(root);return0;}
结果:
到此,关于“C语言怎么用cJSON解析JSON格式”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注主机评测网网站,小编会继续努力为大家带来更多实用的文章!
下一篇:ant-design-vue?table分页onShowSizeChange后的pageNo怎么解决