简述
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. }
















