您的位置:首页 > Web前端 > JavaScript

CJSON 实例

2015-07-03 15:54 615 查看
cJSON: 一个用c写的一个简单好用的JSON解析器

cJSON库

1、json的数据结构

c语言中json数据是采用链表存储的

typedef struct cJSON {

struct cJSON *next,*prev;// 数组 对象数据中用到

struct cJSON *child;// 数组 和对象中指向子数组对象或值

int type;// 元素的类型,如是对象还是数组

char *valuestring;// 如果是字符串

int valueint;
// 如果是数值

double valuedouble;// 如果类型是cJSON_Number

char *string;// The item's name string, if this item is the child of, or is in the list of subitems of an object.

} cJSON;

cJSON使用

{

"name": "Jack (\"Bee\") Nimble",

"format": {

"type": "rect",

"width": 1920,

"height": 1080,

"interlace": false,

"frame rate": 24

}

}

1、字符串解析成json结构体

1):字符串解析成json结构体。

cJSON *root = cJSON_Parse(my_json_string);

2):获取某个元素

cJSON *format = cJSON_GetObjectItem(root,"format");

int framerate = cJSON_GetObjectItem(format,"frame rate")->valueint;

int framerate = cJSON_GetObjectItem(format,"frame rate")->valueint;

3):讲json结构体转换成字符串

char *rendered=cJSON_Print(root);

4):删除

cJSON_Delete(root);

2:构建一个json结构体

cJSON *root,*fmt;

root=cJSON_CreateObject();

cJSON_AddItemToObject(root, "name", cJSON_CreateString("Jack (\"Bee\") Nimble"));

cJSON_AddItemToObject(root, "format", fmt=cJSON_CreateObject());

cJSON_AddStringToObject(fmt,"type", "rect");

cJSON_AddNumberToObject(fmt,"width", 1920);

cJSON_AddNumberToObject(fmt,"height", 1080);

cJSON_AddFalseToObject (fmt,"interlace");

cJSON_AddNumberToObject(fmt,"frame rate", 24)

out =cJSON_Print(root);

printf("%s\n",out);

cJSON_Delete(root);

free(out);

本文用代码简单介绍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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: