使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解

本文用代码简单介绍cjson的使用方法,1)创建json,从json中获取数据。2)创建json数组和解析json数组

 

1、 创建json,从json中获取数据

  1 #include <stdio.h>                                                                                            

  2 #include "cJSON.h"

  3 

  4 char * makeJson()

  5 {

  6     cJSON * pJsonRoot = NULL;

  7 

  8     pJsonRoot = cJSON_CreateObject();

  9     if(NULL == pJsonRoot)

 10     {

 11         //error happend here

 12         return NULL;

 13     }

 14     cJSON_AddStringToObject(pJsonRoot, "hello", "hello world");

 15     cJSON_AddNumberToObject(pJsonRoot, "number", 10010);

 16     cJSON_AddBoolToObject(pJsonRoot, "bool", 1);

 17     cJSON * pSubJson = NULL;

 18     pSubJson = cJSON_CreateObject();

 19     if(NULL == pSubJson)

 20     {

 21         // create object faild, exit

 22         cJSON_Delete(pJsonRoot);

 23         return NULL;

 24     }

 25     cJSON_AddStringToObject(pSubJson, "subjsonobj", "a sub json string");

 26     cJSON_AddItemToObject(pJsonRoot, "subobj", pSubJson);

 27 

 28     char * p = cJSON_Print(pJsonRoot);

 29   // else use : 

 30     // char * p = cJSON_PrintUnformatted(pJsonRoot);

 31     if(NULL == p)

 32     {

 33         //convert json list to string faild, exit

 34         //because sub json pSubJson han been add to pJsonRoot, so just delete pJsonRoot, if you also delete pSubJson, it will coredump, and error is : double free

 35         cJSON_Delete(pJsonRoot);

 36         return NULL;

 37     }

 38     //free(p);

 39     

 40     cJSON_Delete(pJsonRoot);

 41 

 42     return p;

 43 }

 44 

 45 void parseJson(char * pMsg)

 46 {

 47     if(NULL == pMsg)

 48     {

 49         return;

 50     }

 51     cJSON * pJson = cJSON_Parse(pMsg);

 52     if(NULL == pJson)                                                                                         

 53     {

 54         // parse faild, return

 55       return ;

 56     }

 57 

 58     // get string from json

 59     cJSON * pSub = cJSON_GetObjectItem(pJson, "hello");

 60     if(NULL == pSub)

 61     {

 62         //get object named "hello" faild

 63     }

 64     printf("obj_1 : %s\n", pSub->valuestring);

 65 

 66     // get number from json

 67     pSub = cJSON_GetObjectItem(pJson, "number");

 68     if(NULL == pSub)

 69     {

 70         //get number from json faild

 71     }

 72     printf("obj_2 : %d\n", pSub->valueint);

 73 

 74     // get bool from json

 75     pSub = cJSON_GetObjectItem(pJson, "bool");

 76     if(NULL == pSub)

 77     {

 78         // get bool from json faild

 79     }                                                                                                         

 80     printf("obj_3 : %d\n", pSub->valueint);

 81 

 82  // get sub object

 83     pSub = cJSON_GetObjectItem(pJson, "subobj");

 84     if(NULL == pSub)

 85     {

 86         // get sub object faild

 87     }

 88     cJSON * pSubSub = cJSON_GetObjectItem(pSub, "subjsonobj");

 89     if(NULL == pSubSub)

 90     {

 91         // get object from subject object faild

 92     }

 93     printf("sub_obj_1 : %s\n", pSubSub->valuestring);

 94 

 95     cJSON_Delete(pJson);

 96 }

 97 

 98 int main()

 99 {

100     char * p = makeJson();

101     if(NULL == p)

102     {

103         return 0;

104     }

105     printf("%s\n", p);

106     parseJson(p);                                                                                             

107   free(p);  //千万不要忘记释放内存呀,cJSON_Print()函数或者cJSON_PrintUnformatted()产生的内存,使用free(char *)进行释放

108     return 0;

109 }

  

centos下编译通过,运行结果如下

 1 {

 2     "hello":    "hello world",

 3     "number":    10010,

 4     "bool":    true,

 5     "subobj":    {

 6         "subjsonobj":    "a sub json string"

 7     }

 8 }

 9 obj_1 : hello world

10 obj_2 : 10010

11 obj_3 : 1

12 sub_obj_1 : a sub json string

代码解释如下:

CJSON在内存中的存储方式是用链表进行存储的,所以在进行操作的时候,我们可见的部分全部是用指针进行操作的。

第8行新建一个JSON项目。

第14、15、16行分别添加了字符串、数字和bool变量。

第18行新建一个JSON项目:pSubJson。

第25行在新建的pSubJson项目上添加字符串。

第26行把我们的新项目添加到最初的项目pJsonRoot上。

第28行把CJSON的内存的存储的数据转换为字符串格式。

cjson库的 百度网盘 下载地址在:http://pan.baidu.com/s/1ntsRLgt

 

结果分析:

第1到8行为创建的JSON字符串

第9到12行为从JSON解析得到的数据

 

2、创建json数组和解析json数组

 1 //创建数组,数组值是另一个JSON的item,这里使用数字作为演示

 2 char * makeArray(int iSize)

 3 {

 4     cJSON * root =  cJSON_CreateArray();                                                             

 5     if(NULL == root)

 6     {

 7         printf("create json array faild\n");

 8         return NULL;

 9     }

10     int i = 0;

11     

12     for(i = 0; i < iSize; i++)

13     {

14         cJSON_AddNumberToObject(root, "hehe", i);

15     }

16     char * out = cJSON_Print(root);

17     cJSON_Delete(root);

18 

19     return out;

20 }

21 

22 //解析刚刚的CJSON数组

23 void parseArray(char * pJson)

24 {

25     if(NULL == pJson)

26     {                                                                                                

27         return ;

28     }

29     cJSON * root = NULL;

30     if((root = cJSON_Parse(pJson)) == NULL)

31     {

32         return ;

33     }

34     int iSize = cJSON_GetArraySize(root);

35     for(int iCnt = 0; iCnt < iSize; iCnt++)

36     {

37         cJSON * pSub = cJSON_GetArrayItem(root, iCnt);

38         if(NULL == pSub)

39         {

40             continue;

41         }

42         int iValue = pSub->valueint;

43         printf("value[%2d] : [%d]\n", iCnt, iValue);

44     }   

45     cJSON_Delete(root);

46     return;

47 }

输出结果

1)创建JSON数组

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

2)解析数组的输出结果

value[ 0] : [0]

value[ 1] : [1]

value[ 2] : [2]

value[ 3] : [3]

value[ 4] : [4]

value[ 5] : [5]

value[ 6] : [6]

value[ 7] : [7]

value[ 8] : [8]

value[ 9] : [9]

 

 作者:风波

 email: [email protected]

 

你可能感兴趣的:(json)