cjson简单使用
为什么选择cJSON来解析JSON字符串?因为简洁又简单,而且效率又快,cJSON工程文件也非常简单,仅一个.c文件和一个.h文件!且文件体积大小不到30k,源代码思路也非常清晰,也非常适合研究。官方链接当我们下载好cJSON只需要把.c和.h文件包含文件拷贝到我们工程目录下,并将头文件和实现文件包含进来就可以使用了!编译的时候需要添加- l...
为什么选择cJSON来解析JSON字符串?因为简洁又简单,而且效率又快,cJSON工程文件也非常简单,仅一个.c文件和一个.h文件!
且文件体积大小不到30k,源代码思路也非常清晰,也非常适合研究。
cJSON源码下载地址 https://sourceforge.net/projects/cjson/
当我们下载好cJSON只需要把.c和.h文件包含文件拷贝到我们工程目录下,并将头文件和实现文件包含进来就可以使用了!
编译的时候需要添加- lm库
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函数:
```c 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
```c void cJSON_Delete(cJSON *c); ```作用:释放位于堆中cJSON结构体内存
返回值:无
假如说有这样的一个JSON字符串
{
"test_1":"0"
"test_2":"1"
"test_3":"2"
} //json_string
//json_string
这是最简单的JSON字符串
我们首先要先将这个字符串打包成cJSON数据格式
cJSON* cjson = cJSON_Parse(json_string);
打包后使用if语句或三目表达式判断一下是否将JSON字符串打包成cJSON数据格式
if(cjson == NULL){
printf("json pack into cjson error...")
}
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_string);
最后别忘记释放内存
//delete cjson
cJSON_Delete(cjson);
cJSON_Delete(test_arr);
cJSON_Delete(arr_item);
完整代码:
#include <stdio.h>
#include <cJSON.h>
int main(){
char* json_string =\
//用char* 模拟一个JSON字符串
"{"\
"test_1":"0"\
"test_2":"1"\
"test_3":"2"\
"}";
//JSON字符串到cJSON格式
cJSON* cjson = cJSON_Parse(json_string);
//判断cJSON_Parse函数返回值确定是否打包成功
if(cjson == NULL){
printf("json pack into cjson error...")
}
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;
char* test_3_string = cJSON_GetObjectltem(cjson,"test_3")->valuestring;
//打印输出
printf("%s",*test_1_string);
printf("%s",*test_2_string);
printf("%s",*test_3_string);
//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_1":"1",
"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("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){
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);
完整代码:
#include <stdio.h>
#include <cJSON.h>
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("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){
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;//下一个子对象
}
//delete cjson 这里只需要释放cjson即可,因为其它的都指向它
cJSON_Delete(cjson);
cJSON有九种类型
Invalid类型
False类型
True类型
Null类型
Number类型
String类型
Array类型
Object类型
Raw类型
/* 返回cJSON的版本,字符串格式 */
CJSON_PUBLIC(const char*) cJSON_Version(void);
/* 某些平台如果需要自定义内存操作函数,使用该接口定义 */
CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks);
/* json字符串解析成json对象,解析成的对象,必须使用 cJSON_Delete 释放*/
CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value); /* 将字符串解析成cJSON结构体 */
CJSON_PUBLIC(cJSON *) cJSON_ParseWithLength(const char *value, size_t buffer_length);
/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */
/* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */
CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated);
CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_bool require_null_terminated);
/* 将json对象输出成字符串*/
/* 该API会申请内存输出结果,调用后必须通过(free)释放,否则会造成内存泄漏 */
CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item); /* 将cJSON结构体转换成格式化的字符串. */
CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item);/* 将cJSON结构体转换成未格式化的字符串 */
CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt); /*将cJSON结构体转换成字符串,prebuffer表示期望的长度,可以减少内存分配次数, fmt=0表示不需要格式化,fmt=1表示需要格式化 */
CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format);/* 将cJSON结构体转换到指定的内存区域,长度需要比实际长度多5字节 */
CJSON_PUBLIC(void) cJSON_Delete(cJSON *item); /* 删除一个cJSON实体及其所有子实体 */
CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array);/* 返回Array类型包含的对象个数 */
CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index);/* 从array中检索条目index,成功返回该对象,否则返回null */
CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string);/* 使用key获得对应的value,不区分大小写 */
CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string); /* 使用key获得对应的value,要区分大小写 */
CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string);/* 判断是否ObjectItem存在*/
CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void); /* 获得错误信息 */
/* 检查值并返回 */
CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item);
CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item);
/* 判断类型 */
CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item); /* 是否有效 */
CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item); /* 是否为false */
CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item); /* 是否为true */
CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item); /* 是否为bool */
CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item); /* 是否为null */
CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item); /* 是否为Number */
CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item); /* 是否为String */
CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item); /* 是否为Array */
CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item);/* 是否为Object */
CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item); /* 是否为Raw*/
/* 创建适当类型的cJSON项 */
CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void);
CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void);
CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void);
CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean);
CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num);
CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string);
/* raw json */
CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw);
CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void);
CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void);
/* 创建一个String */
CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string);
/* 创建一个Object/Array */
CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child);
CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child);
/* 创建指定类型的Array*/
CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count);
CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count);
CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count);
CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char *const *strings, int count);
/* 向指定的数组/对象追加 item */
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item);
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item); /* 在指定Object后面增加const Item */
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item); /* 在指定Array后面增加Item引用 */
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item); /* 在指定Object后面增加Item引用 */
/* 移除或者删除object */
CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item); /* 从Array删除Item的引用*/
CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which); /* 从Array删除Item的引用 */
CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which); /* 从Array删除Item*/
CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string); /* 移除指定key的object 不区分大小写*/
CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string); /* 移除指定key的object 区分大小写*/
CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string); /* 删除指定key的object 不区分大小写*/
CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string); /* 删除指定key的object 区分大小写*/
/* 更新 array items. */
CJSON_PUBLIC(cJSON_bool) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* 在Array指定位置插入Item */
CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement); /* 替换obj */
CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem);
CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem); /* 指定key替换,不区分大小写 */
CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object,const char *string,cJSON *newitem); /* 指定key替换,区分大小写 */
/* 复制一个cJSON */
CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse);
/* 递归比较两个json是否相等 */
CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive);
/*去掉字符串中的格式符号,缩小字符串 */
CJSON_PUBLIC(void) cJSON_Minify(char *json);
/* 同时创建和添加对象项的函数。*他们返回添加obj或NULL失败 */
CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean);
CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number);
CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);
CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw);
CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name);
/* When assigning an integer value, it needs to be propagated to valuedouble too. */
#define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number))
/* helper for the cJSON_SetNumberValue macro */
CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number);
cJSON_SetNumberValue(object, number)
/* 修改cJSON_String对象的valuestring,只在对象类型为cJSON_String时生效 */
CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON *object, const char *valuestring);
/* 如果对象不是布尔类型,则不执行任何操作并返回cJSON_Invalid,否则返回新类型*/
cJSON_SetBoolValue(object, boolValue)
/* 遍历数组或对象的宏 */
cJSON_ArrayForEach(element, array)
/* 使用cJSON_InitHooks设置的malloc/free函数的malloc/free对象 */
CJSON_PUBLIC(void *) cJSON_malloc(size_t size);
CJSON_PUBLIC(void) cJSON_free(void *object);
cJSON 源码链接 https://github.com/faycheng/cJSON
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)