cJSON概念简介:

JSON(JavaScriptObject Notation)是一种轻量级的数据交换格式。可以把JSON的结构理解成无序的、可嵌套的key-value键值对集合,这些key-value键值对是以结构体或数组的形式来组织的。同一级的key-value键值对之间是用一个“,”(逗号)隔开,每个key-value键值对是由一个key后面紧接一个“:”(冒号),冒号后面是这个key对应的value。Key是一个word,由大小写字母、下划线及数字组成,可以由双引号封闭,也可以不加双引号;而value的取值集为:Number、Boolean(true或false)、null、String、Object及Array。

易于人阅读和编写,同时也易于机器解析和生成,已经成为理想的数据交换语言。在C语言中,cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的JSON解析器,很好的衔接了底层和前端数据的交互处理。

cJSON结构体:

typedefstruct cJSON {

structcJSON *next,*prev;

struct cJSON *child;

int type;

char * valuestring;

int valueint;

double valuedouble;

char *string;

}cJSON;

//cJSON存储的时候是采用链表存储的,其访问方式很像一颗树。每一个节点可以有兄妹节点,通过next/prev指针来查找,它类似双向链表;每个节点也可以有孩子节点,通过child指针来访问,进入下一层。

不过,只有节点是对象或数组才可以有孩子节点。

cJSON中的type有7种取值:

#define cJSON_False 0

#define cJSON_True 1

#define cJSON_NULL 2

#define cJSON_Number 3

#define cJSON_String 4

#define cJSON_Array 5

#define cJSON_Object 6

Object:对象,也可理解成一个结构体,是以一对大括号封闭起来的无序的key-value键值对集合,例如:{name:"Susan",age:27,birthday:{year:1984,month:2,day:11}};也可以写成:{"name":"Susan","age":27,"birthday":{"year":1984,"month":2,"day":11}};

Array:数组,JSON的数组是一个以中括号封闭起来的value的集合,即数组内的各个成员的数据类型可以不一样,这一点就跟C/JAVA的数组概念不同了。每个value之间是由一个“,”(逗号)隔开,例如:[123,abc,false,{name:mj}];

代码示例:

1 #include

2 #include "cJSON.h"

3

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

5

6 //调用cjson函数创建json串

7 char* createJsonStr()

8 {

9 cJSON * pJsonRoot = NULL;

10 pJsonRoot = cJSON_CreateObject();//新建一个JSON项目

11 if ( NULL == pJsonRoot )

12 {

13 return NULL;

14 }

15 cJSON_AddStringToObject(pJsonRoot,"sayhi","hello world!!");//在JSON项中添加了字符串

16 cJSON_AddBoolToObject(pJsonRoot,"I`m a man",1);

17 cJSON * pJsonChild = cJSON_CreateObject();//新建一个JSON项目

18 if ( NULL == pJsonChild )

19 {

20 cJSON_Delete(pJsonRoot);

21 return NULL;

22 }

23 cJSON_AddStringToObject(pJsonChild,"name","my name is fengdj");

24 cJSON_AddNumberToObject(pJsonChild,"my age",30);

25 cJSON * pJsonSubChild = cJSON_CreateObject();//新建一个JSON项目

26 if ( NULL == pJsonSubChild)

27 {

28 cJSON_Delete(pJsonRoot);

29 cJSON_Delete(pJsonChild);

30 return NULL;

31 }

32 cJSON_AddStringToObject(pJsonSubChild,"job","I`m a programmer");

33 cJSON_AddFalseToObject(pJsonSubChild,"baby");

34 cJSON_AddItemToObject(pJsonChild,"sub child item",pJsonSubChild);//把pJsonSubChild项目添加到pJsonChild上。

35 cJSON_AddItemToObject(pJsonRoot,"child item",pJsonChild);//把pJsonChild项目添加到Root项 pJsonRoot

36 char* lpJsonStr = NULL;

37 lpJsonStr = cJSON_Print(pJsonRoot); //CJSON的内存的存储的数据转换为字符串格式

38 cJSON_Delete(pJsonRoot);//因为 child json 和 subchild json 已经被添加到pJsonRoot,所以只需要delete pJsonRoot,

如果你再去delete child 和subchild,将会因重复释放导致程序coredump

39

40 return lpJsonStr;

41 }

42

43 //使用cjson 函数解析json串

44 void parseJsonStr(char* lpJStr)

45 {

46 if( NULL == lpJStr )

47 {

48 return;

49 }

50 cJSON* pJson = cJSON_Parse(lpJStr);//将json串解析后存入cjson内存,并返回cjson实例

51 if( NULL == pJson )

52 {

53 return;

54 }

55 if ( pJson->type == cJSON_Object )

56 {

57 cJSON* pJson1 = cJSON_GetObjectItem(pJson,"sayhi");//从cjson内获取对应key的值

58 if ( NULL == pJson1 )

59 {

60 return;

61 }

62 //pJson1->type

63 printf("%s\n",pJson1->valuestring);

64

65 //+++++

66 cJSON* pNext = pJson1->next; //cJSON_GetObjectItem(pJson,"I`m a man");

67 if ( NULL != pNext )

68 {

69 int iValue = pNext->valueint;

70 printf("+++%d\n",iValue);

71 cJSON* pPre = pNext->prev;

72 if ( NULL != pPre )

73 {

74 printf("++%s\n",pPre->valuestring);

75 }

76 }

77 //++++++

78

79 cJSON* pJson2 = cJSON_GetObjectItem(pJson,"I`m a man");

80 if ( NULL == pJson2 )

81 {

82 return;

83 }

84 //pJson2->type

85 printf("%d\n",pJson2->valueint);

86

87 cJSON* pJson3 = cJSON_GetObjectItem(pJson,"child item");

88 if ( NULL == pJson3 )

89 {

90 return;

91 }

92 if ( pJson3->type == cJSON_Object )

93 {

94 cJSON* pJson31 = cJSON_GetObjectItem(pJson3,"name");

95 if ( NULL == pJson31 )

96 {

97 return;

98 }

99 printf("%s\n",pJson31->valuestring);

100 cJSON* pJson32 = cJSON_GetObjectItem(pJson3,"my age");

101 if ( NULL == pJson32 )

102 {

103 return;

104 }

105 printf("%f\n",pJson32->valuedouble);

106 printf("%d\n",pJson32->valueint);

107 }

108 cJSON* pJson4 = cJSON_GetObjectItem(pJson3,"sub child item");

109 if ( NULL == pJson4 )

110 {

111 return;

112 }

113 if ( pJson4->type == cJSON_Object )

114 {

115 cJSON* pJson41 = cJSON_GetObjectItem(pJson4,"job");

116 if ( NULL == pJson41 )

117 {

118 return;

119 }

120 printf("%s\n",pJson41->valuestring);

121 }

122 }

123 cJSON_Delete(pJson); //程序结束前,回收cjson实例,上述子节点的cjson实例会一并回收

124 }

125

126 //释放json串内存

127 void releaseJsonStr(char *lpJsonStr)

128 {

129 if ( NULL != lpJsonStr )

130 {

131 free(lpJsonStr);

132 }

133 }

135 //创建json数组

136 char* createJsonArray(int iSize)

137 {

138 cJSON * JsonArray = cJSON_CreateArray();

139 if ( NULL == JsonArray )

140 {

141 return NULL;

142 }

143 int i = 0;

144 for ( i=0; i

145 {

146 cJSON_AddNumberToObject(JsonArray,"hehe",i);

147 }

148 for ( i=iSize; i

149 {

150 cJSON_AddStringToObject(JsonArray,"he","test");

151 }

152 char * lpArrayJsonStr = cJSON_Print(JsonArray);

153 cJSON_Delete(JsonArray);

154 return lpArrayJsonStr;

155 }

156

157 //解析cjson数组

158 void parseArray(char* lpJsonArrayStr)

159 {

160 if ( NULL == lpJsonArrayStr)

161 {

162 return;

163 }

164 cJSON * pJsonRoot = NULL;

165 pJsonRoot = cJSON_Parse(lpJsonArrayStr);

166 if ( NULL == pJsonRoot )

167 {

168 return;

169 }

170 if ( pJsonRoot->type == cJSON_Array )

171 {

172 int iSize = cJSON_GetArraySize(pJsonRoot);

173 int iIndex = 0;

174 for( ; iIndex

175 {

176 cJSON* pItem = cJSON_GetArrayItem(pJsonRoot,iIndex);

177 if ( NULL == pItem )

178 {

179 continue;

180 }

181 if ( pItem->type == cJSON_String )

182 {

183 printf("%s\n",pItem->valuestring);

184 }

185 else if ( pItem->type == cJSON_Number )

186 {

187 int iValue = pItem->valueint;//若你期望的是int,则访问valueint,若期望的是double,则访问valuedouble

188 printf("%d\n",iValue);

189 }

190 }

191 }

192 cJSON_Delete(pJsonRoot);

193 return ;

194 }

195

196 int main()

197 {

198 //创建json 串和解析json串

199 char * lpStr = createJsonStr();

200 if( NULL == lpStr )

201 {

202 return -1;

203 }

204 printf("%s\n",lpStr);

205 parseJsonStr(lpStr);

206 releaseJsonStr(lpStr);

207

208 //创建json数组和解析json数组

209 char * lpArrayJsonStr = createJsonArray(6);

210 if ( NULL == lpArrayJsonStr )

211 {

212 return -1;

213 }

214 printf("%s\n",lpArrayJsonStr);

215 parseArray(lpArrayJsonStr);

216 releaseJsonStr(lpArrayJsonStr);

217 return 0;

218 }

219

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

221

222

=============================out put===================================

[fengdj@localhost testCJson]$ gcc *.c -lm

[fengdj@localhost testCJson]$ ./a.out

{

"sayhi": "hello world!!",

"I`m a man": true,

"child item": {

"name": "my name is fengdj",

"my age": 30,

"sub child item": {

"job": "I`m a programmer",

"baby": false

}

}

}

hello world!!

+++1

++hello world!!

1

my name is fengdj

30.000000

30

I`m a programmer

[0,1,2,3,"test","test"]

0

1

2

3

test

test

=============================================================================

1、只需在函数中includecJSON.h头文件,然后和cJSON.c或库文件libcJSON.a一起编译即可使用。

2、具体函数用法详见cJSON.h中注释

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

GitHub 加速计划 / cj / cJSON
10.45 K
3.16 K
下载
Ultralightweight JSON parser in ANSI C
最近提交(Master分支:2 个月前 )
424ce4ce This reverts commit 5b502cdbfb21fbe5f6cf9ffbd2b96e4281a741e6. Related to #860 4 个月前
32497300 - 5 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐