简述
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?
- #include
- #include
- #include
-
- #include "cJSON.h"
-
- int main(void)
- {
- //创建一个空的对象
- cJSON *jsons = cJSON_CreateObject();
- cJSON_AddItemToObject(jsons, "name", cJSON_CreateString("你大爷"));
- cJSON_AddItemToObject(jsons, "age", cJSON_CreateNumber(111));
- //创建一个空的对象
- cJSON *root = cJSON_CreateObject();
-
- //向对象中添加一个元素
- cJSON_AddItemToObject(root, "name", cJSON_CreateString("王铁锤"));
- cJSON_AddItemToObject(root, "age", cJSON_CreateNumber(30));
-
- //创建一个数组对象
- cJSON *array = cJSON_CreateArray();
- //向数组中添加元素
- cJSON_AddItemToArray(array, cJSON_CreateNumber(33));
- cJSON_AddItemToArray(array, cJSON_CreateNumber(100));
- cJSON_AddItemToArray(array, cJSON_CreateNumber(50));
- cJSON_AddItemToArray(array, jsons);
-
- //把数组添加到root中
- cJSON_AddItemToObject(root, "array", array);
-
- //直接添加键值对
- //这种简单的函数调用实际上是宏函数 底层调用也是cJSON_AddItemToObject
- cJSON_AddNumberToObject(root, "score", 370);
- cJSON_AddStringToObject(root, "address", "北京");
-
- /****************解码操作*******************/
- //判断是否有key值
- int ret = 0;
- ret = cJSON_HasObjectItem(root, "name");
- //printf("有该key:%d\n", ret);
- ret = cJSON_HasObjectItem(root, "ages");
- //printf("没有该key:%d\n", ret);
-
- //获取json对象中的一个元素 即获取了一个数组
- cJSON * temp = cJSON_GetObjectItem(root, "array");
- int num = 0;
- //获取数组元素个数
- num = cJSON_GetArraySize(temp);
- printf("数组的个数;%d\n", num);
- //获取数组下标为2的值
- cJSON * tempnode = cJSON_GetArrayItem(temp, 2);
- printf("下标为2的数组值:%d\n", tempnode->valueint);
- char *buf = cJSON_Print(root);
-
- //取出数组中的对象{ }
- cJSON * tempobjest = cJSON_GetArrayItem(temp, 3);
- //获取该对象中的元素
- cJSON *name = cJSON_GetObjectItem(tempobjest, "name");
- printf("name:%s\n", name->valuestring);
- cJSON *age = cJSON_GetObjectItem(tempobjest, "age");
- printf("age:%d\n", age->valueint);
-
-
- //打开文件写书json数据
- FILE *fp = fopen("test.json", "w");
- fwrite(buf, 1, strlen(buf), fp);
- free(buf);
- fclose(fp);
- //释放
- cJSON_Delete(root);
-
-
- system("pause");
- return 0;
- }