本文用代码简单介绍 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);
- 107free(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[-] : [%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]
来源: http://www.bubuko.com/infodetail-2159204.html