简述

json是存储和交换文本信息的语法,与xml类似。Json有两种结构,分别是数组和对象

json解析环境

cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的JSON解析器,cJSON库包括cJSON.h和cJSON.c两个文件,放入指定目录直接调用就可以了。

语法

1. 有一对基本的 {  }

2. 内部都是键值对格式。key 值为字符串 "key"

3. value可取值有:字符串、数值、数组、对象、NULL、true、false

4,数据有逗号分隔

5,花括号保存对象

6,方括号保存数组

示例

 

JSON库的使用步骤及常用API

生成json文件

(1)创建一个json的对象{ }: cJSON *json = cJSON_CreateObject()

(2)添加一个元素 到 对象中: cJSON_AddItemToObject(json, "key", value)

      value的类型: 

      字符串: cJSON_CreateString("value");

      数值:  cJSON_CreateNumber(value);

      数组:  cJSON_CreateArray(无参);

      对象:  cJSON_CreateObject(void);

(3)添加一个元素 到数组中: cJSON_AddItemToArray(arr, Item);   Item 是 cJSON类型

(4)添加具体类型的元素到 Object中:

      宏函数:cJSON_AddNumberToObject(json, "key", value);  value 是 int

      宏函数:cJSON_AddStringToObject(json, "key", value);         value 是String

(5)调用c的文件操作函数fwrite() 生成一个json文件。

 

解析json文件

(1)调用c的文件操作函数 fread() 读取json文件

(2)解析一个 json 格式的字符串, 生成 cJSON的结构体 cJSON *data = cJSON_Parse(buf);

(3)将cJSON 结构体格式的 json对象,转换成 char * buf = cJSON_Print(data);

(4)获取json对象中的元素:cJSON * node = cJSON_GetObjectItem(json, "key");

(5)判断 json对象中是否含有某一个元素:cJSON_HasObjectItem(json, "key");  有:1, 无:0

(6)node->type  判断 对象的value类型。  参看 cJSON结构体。

(7)获取 数组元素的个数:cJSON_GetArraySize(nodeArr);

(8)根据数组下标,获取元素:cJSON_GetArrayItem(nodeArr, index);

(9)遍历数组:cJSON_ArrayForEach(tmpnode, nodeArr);

 

 

cJSON库的解析代码实例(结果为以上的json示例)

 

[cpp] view plain copy print?

1. #include <stdio.h>  
2. #include <string.h>  
3. #include <time.h>  
4.   
5. #include "cJSON.h"  
6.   
7. int main(void)  
8. {  
9.     //创建一个空的对象  
10.     cJSON *jsons = cJSON_CreateObject();  
11.     cJSON_AddItemToObject(jsons, "name", cJSON_CreateString("你大爷"));  
12.     cJSON_AddItemToObject(jsons, "age", cJSON_CreateNumber(111));  
13.     //创建一个空的对象  
14.     cJSON *root = cJSON_CreateObject();  
15.   
16.     //向对象中添加一个元素  
17.     cJSON_AddItemToObject(root, "name", cJSON_CreateString("王铁锤"));  
18.     cJSON_AddItemToObject(root, "age", cJSON_CreateNumber(30));  
19.       
20.     //创建一个数组对象  
21.     cJSON *array = cJSON_CreateArray();  
22.     //向数组中添加元素  
23.     cJSON_AddItemToArray(array, cJSON_CreateNumber(33));  
24.     cJSON_AddItemToArray(array, cJSON_CreateNumber(100));  
25.     cJSON_AddItemToArray(array, cJSON_CreateNumber(50));  
26.     cJSON_AddItemToArray(array, jsons);  
27.   
28.     //把数组添加到root中  
29.     cJSON_AddItemToObject(root, "array", array);  
30.   
31.     //直接添加键值对      
32.     //这种简单的函数调用实际上是宏函数  底层调用也是cJSON_AddItemToObject  
33.     cJSON_AddNumberToObject(root, "score", 370);  
34.     cJSON_AddStringToObject(root, "address", "北京");  
35.   
36.     /****************解码操作*******************/  
37.     //判断是否有key值  
38.     int ret = 0;  
39.     ret = cJSON_HasObjectItem(root, "name");  
40.     //printf("有该key:%d\n", ret);  
41.     ret = cJSON_HasObjectItem(root, "ages");  
42.     //printf("没有该key:%d\n", ret);  
43.   
44.     //获取json对象中的一个元素   即获取了一个数组  
45.     cJSON * temp = cJSON_GetObjectItem(root, "array");  
46.     int num = 0;  
47.     //获取数组元素个数  
48.     num = cJSON_GetArraySize(temp);  
49.     printf("数组的个数;%d\n", num);  
50.     //获取数组下标为2的值  
51.     cJSON * tempnode = cJSON_GetArrayItem(temp, 2);  
52.     printf("下标为2的数组值:%d\n", tempnode->valueint);  
53.     char *buf = cJSON_Print(root);  
54.   
55.     //取出数组中的对象{  }  
56.     cJSON * tempobjest = cJSON_GetArrayItem(temp, 3);  
57.     //获取该对象中的元素  
58.     cJSON *name = cJSON_GetObjectItem(tempobjest, "name");  
59.     printf("name:%s\n", name->valuestring);  
60.     cJSON *age = cJSON_GetObjectItem(tempobjest, "age");  
61.     printf("age:%d\n", age->valueint);  
62.   
63.   
64.     //打开文件写书json数据  
65.     FILE *fp = fopen("test.json", "w");  
66.     fwrite(buf, 1, strlen(buf), fp);  
67.     free(buf);  
68.     fclose(fp);  
69.     //释放  
70.     cJSON_Delete(root);  
71.   
72.   
73.     system("pause");  
74.     return 0;  
75. }