当前位置:   article > 正文

全面详解c语言使用cJSON解析JSON字符_cjson字符串值

cjson字符串值

为什么选择cJSON来解析JSON字符串?因为简洁又简单,而且效率又快,cJSON工程文件也非常简单,仅一个.c文件和一个.h文件!

如果要自己写的话就是重造轮子了,况且效率上也不一定会比cJSON更好!

且文件体积大小不到30k,源代码思路也非常清晰,也非常适合研究。

点我下载cJSON

当我们下载好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_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("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){
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 <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("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){
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_Delete(cjson);
cJSON_Delete(test_arr);
cJSON_Delete(arr_item);
 

 

基本接口说明
创建的JSON格式说明:{}表示一个Object,[]表示一个Array

cJSON_CreateObject:创建一个JSON结构体 
cJSON_AddItemToObject:把一个item添加到JSON结构体里 
cJSON_Print:将JSON格式的字符串转成普通字符串 
cJSON_Parse:将普通字符串转成JSON格式的字符串 
cJSON_Delete:释放JSON结构体
下面这些宏定义可以更快捷地帮助你创建JSON节点

  1. #define cJSON_AddNullToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateNull())
  2. #define cJSON_AddTrueToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue())
  3. #define cJSON_AddFalseToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse())
  4. #define cJSON_AddBoolToObject(object,name,b) cJSON_AddItemToObject(object, name, cJSON_CreateBool(b))
  5. #define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n))
  6. #define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s))

比如如果要添加一个“name”:“Tom”的节点,下面两行代码都是相等的

  1. cJSON_AddStringToObject(root, "name", "Tom")
  2. cJSON_AddItemToObject(root, "name", cJSON_CreateString("Tom"))

 

创建JSON的方法

demo1

  1. {
  2. "name": "Tom",
  3. "age": 25,
  4. "marry": true,
  5. "child": null
  6. }

创建demo1的代码实现

  1. char * cjson_create_test1(void)
  2. {
  3. char * out;
  4. cJSON *root;
  5. root = cJSON_CreateObject();
  6. if(!root)
  7. {
  8. printf("cJSON create error!!\n");
  9. return NULL;
  10. }
  11. cJSON_AddItemToObject(root, "name", cJSON_CreateString("Tom"));
  12. cJSON_AddItemToObject(root, "age", cJSON_CreateNumber(25));
  13. cJSON_AddItemToObject(root, "marry", cJSON_CreateBool(1));
  14. cJSON_AddItemToObject(root, "child", cJSON_CreateNull());
  15. out=cJSON_Print(root);
  16. cJSON_Delete(root);
  17. if(out)
  18. {
  19. printf("%s\n", out);
  20. return out;
  21. }
  22. return NULL;
  23. }

 demo2

  1. {
  2. "name": "Tom",
  3. "age": 25,
  4. "marry": true,
  5. "children": [{
  6. "name": "May",
  7. "age": 2
  8. }, {
  9. "name": "Kendy",
  10. "age": 3
  11. }, {
  12. "name": "Mark",
  13. "age": 1
  14. }]
  15. }

创建demo2的实现方法

  1. char * cjson_create_test2(void)
  2. {
  3. char * out;
  4. cJSON *root;
  5. cJSON *child, *child1, *child2, *child3;
  6. root = cJSON_CreateObject();
  7. if(!root)
  8. {
  9. printf("cJSON create error!!\n");
  10. return NULL;
  11. }
  12. cJSON_AddItemToObject(root, "name", cJSON_CreateString("Tom"));
  13. cJSON_AddItemToObject(root, "age", cJSON_CreateNumber(25));
  14. cJSON_AddItemToObject(root, "marry", cJSON_CreateBool(1));
  15. child = cJSON_CreateArray();
  16. CJSON_CHK_FAIL(child, NULL);
  17. cJSON_AddItemToObject(root, "children", child);
  18. child1 = cJSON_CreateObject();
  19. CJSON_CHK_FAIL(child1, NULL);
  20. cJSON_AddItemToObject(child1, "name", cJSON_CreateString("May"));
  21. cJSON_AddItemToObject(child1, "age", cJSON_CreateNumber(2));
  22. child2 = cJSON_CreateObject();
  23. CJSON_CHK_FAIL(child2, NULL);
  24. cJSON_AddItemToObject(child2, "name", cJSON_CreateString("Kendy"));
  25. cJSON_AddItemToObject(child2, "age", cJSON_CreateNumber(3));
  26. child3 = cJSON_CreateObject();
  27. CJSON_CHK_FAIL(child3, NULL);
  28. cJSON_AddItemToObject(child3, "name", cJSON_CreateString("Mark"));
  29. cJSON_AddItemToObject(child3, "age", cJSON_CreateNumber(1));
  30. cJSON_AddItemToArray(child, child1);
  31. cJSON_AddItemToArray(child, child2);
  32. cJSON_AddItemToArray(child, child3);
  33. out=cJSON_Print(root);
  34. cJSON_Delete(root);
  35. if(out)
  36. {
  37. printf("%s\n", out);
  38. return out;
  39. }
  40. return NULL;
  41. }

解析JSON的方法

解析上面的demo1

  1. void cjson_parse_test1(void)
  2. {
  3. cJSON * root;
  4. cJSON *name, *age, *marry, *child;
  5. root = cJSON_Parse(cjson_create_test1());
  6. if(!root)
  7. {
  8. printf("cJSON_Parse error!!\n");
  9. return;
  10. }
  11. name = cJSON_GetObjectItem(root, "name");
  12. if(name)
  13. {
  14. printf("Get name value : %s\n", name->valuestring);
  15. }
  16. age = cJSON_GetObjectItem(root, "age");
  17. if(age)
  18. {
  19. printf("Get age value : %d\n", age->valueint);
  20. }
  21. marry = cJSON_GetObjectItem(root, "marry");
  22. if(marry)
  23. {
  24. printf("Get marry value : %d\n", marry->valueint);
  25. }
  26. child = cJSON_GetObjectItem(root, "child");
  27. if(child)
  28. {
  29. printf("Get child value : %s\n", marry->valuestring);
  30. }
  31. cJSON_Delete(root);
  32. }

解析上面的demo2

  1. void cjson_parse_test2(void)
  2. {
  3. cJSON * root;
  4. cJSON *name, *age, *marry, *children;
  5. cJSON *childNode, *childName, *childAge;
  6. root = cJSON_Parse(cjson_create_test2());
  7. if(!root)
  8. {
  9. printf("cJSON_Parse error!!\n");
  10. return;
  11. }
  12. name = cJSON_GetObjectItem(root, "name");
  13. if(name)
  14. {
  15. printf("Get name value : %s\n", name->valuestring);
  16. }
  17. age = cJSON_GetObjectItem(root, "age");
  18. if(age)
  19. {
  20. printf("Get age value : %d\n", age->valueint);
  21. }
  22. marry = cJSON_GetObjectItem(root, "marry");
  23. if(marry)
  24. {
  25. printf("Get marry value : %d\n", marry->valueint);
  26. }
  27. children = cJSON_GetObjectItem(root, "children");
  28. if(children)
  29. {
  30. int size = cJSON_GetArraySize(children);
  31. printf("Get children size : %d\n", size);
  32. int i = 0;
  33. for(i=0; i<size; i++)
  34. {
  35. childNode = cJSON_GetArrayItem(children, i);
  36. if(childNode)
  37. {
  38. childName = cJSON_GetObjectItem(childNode,"name");
  39. if(childName)
  40. {
  41. printf("Get child name : %s\n", childName->valuestring);
  42. }
  43. childAge = cJSON_GetObjectItem(childNode,"age");
  44. if(childAge)
  45. {
  46. printf("Get child age : %d\n", childAge->valueint);
  47. }
  48. }
  49. }
  50. }
  51. cJSON_Delete(root);
  52. }

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/272827
推荐阅读