(转)使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解
使用 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]
(转)使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解的更多相关文章
- 使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解
本文用代码简单介绍cjson的使用方法,1)创建json,从json中获取数据.2)创建json数组和解析json数组 1. 创建json,从json中获取数据 #include <stdio. ...
- PHP语言中使用JSON
原文地址:http://www.ruanyifeng.com/blog/2011/01/json_in_php.html 在PHP语言中使用JSON 目前,JSON已经成为最流行的数据交换格式之一,各 ...
- JSON(三)——java中对于JSON格式数据的解析之json-lib与jackson
java中对于JSON格式数据的操作,主要是json格式字符串与JavaBean之间的相互转换.java中能够解析JSON格式数据的框架有很多,比如json-lib,jackson,阿里巴巴的fast ...
- C语言中头文件和cpp文件解析
务必提前预读这里的内容:http://www.cnblogs.com/stemon/p/3999844.html 回到cpp文件与头文件各写什么内容的话题上: 理论上来说cpp文件与头文件里的内容,只 ...
- 在Go语言中使用JSON(去掉空字段)
Encode 将一个对象编码成JSON数据,接受一个interface{}对象,返回[]byte和error: func Marshal(v interface{}) ([]byte, error) ...
- (转)在PHP语言中使用JSON
原文 : http://www.ruanyifeng.com/blog/2011/01/json_in_php.html --------------------------------------- ...
- [转]在PHP语言中使用JSON
本文转自:http://www.ruanyifeng.com/blog/2011/01/json_in_php.html 作者: 阮一峰 日期: 2011年1月14日 目前,JSON已经成为最流行的数 ...
- 在PHP语言中使用JSON
目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它. 我写过一篇<数据类型和JSON格式>,探讨它的设计思想.今天,我想总结一下PHP语言对它的支持,这是开发 ...
- Go -- 在Go语言中使用JSON struct
Encode 将一个对象编码成JSON数据,接受一个interface{}对象,返回[]byte和error: func Marshal(v interface{}) ([]byte, error) ...
随机推荐
- 奇怪吸引子---Halvorsen
奇怪吸引子是混沌学的重要组成理论,用于演化过程的终极状态,具有如下特征:终极性.稳定性.吸引性.吸引子是一个数学概念,描写运动的收敛类型.它是指这样的一个集合,当时间趋于无穷大时,在任何一个有界集上出 ...
- 微软BI 之SSRS 系列 - 实现 Excel 中图表结合的报表设计
来自群里面讨论的一个问题,EXCEL 中有类似于这样的图形,上面是 Chart, Chart X轴上的值正好就是下方 Table 的列头,这个在 SSRS 中应该如何实现? SSRS 2008.2 ...
- Centos或Windows中部署Zookeeper集群及其简单用法
一.简介 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件 ...
- 【C#】C#中的属性与字段
目录结构: contents structure [+] 属性和字段的区别 无参属性 自动实现的属性 对象和集合初始化器 匿名类型 System.Tuple类型 有参属性 属性的可访问性 在这篇文章中 ...
- PHP遍历指定目录,并存储目录内所有文件属性信息
项目需要,需要写一个函数,能够遍历指定目录中的所有文件,而且这个目录中的子目录也要遍历.输出文件的属性信息,并存储. 想想需求,不就是一个ls -al命令吗,实现获取相关属性就好了,再加上一个遍历OK ...
- C#-MVC开发微信应用(4)--微信门户菜单的管理操作
最近对微信接口进行深入的研究,通过把底层接口一步步进行封装后,逐步升级到自动化配置.自动化应答,以及后台处理界面的优化和完善上,力求搭建一个较为完善.适用的微信门户应用管理系统. 在微信门户系统里面, ...
- ElasticSearch性能优化策略【转】
ElasticSearch性能优化主要分为4个方面的优化. 一.服务器部署 二.服务器配置 三.数据结构优化 四.运行期优化 一.服务器部署 1.增加1-2台服务器,用于负载均衡节点 elasticS ...
- iOS之加载Gif图片
Gif图片是非常常见的图片格式,尤其是在聊天的过程中,Gif表情使用地很频繁.但是iOS竟然没有现成的支持加载和播放Gif的类. 简单地汇总了一下,大概有以下几种方法: 一.加载本地Gif文件 1.使 ...
- SQL 中的LastIndexOf,截取最后一次出现字符后面的字符(转)
SQL如何取出一个字符串中最后一个特殊字符右边的字符,例如:10*20*300,怎样得到300? 使用reverse配合charindex来实现. reverse是把字符串倒置,然后通过charind ...
- 【iCore1S 双核心板_ARM】例程十:SYSTICK定时器实验——定时点亮LED
实验原理: 通过STM32的三个GPIO口驱动三色LED的三个通道,设定GPIO为推挽输出,采用 灌电流的方式与LED连接,输出高电平LED灭,输出低电平LED亮,通过系统定时器实现 1s定时,每秒变 ...