json快速入门(cjson解析)

来源:互联网 发布:windows是一种什么系统 编辑:程序博客网 时间:2024/06/16 04:58

简述

json是存储和交换文本信息的语法,与xml类似。Json有两种结构,分别是数组和对象
json解析环境
cJSON库:下载
cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的JSON解析器,cJSON库包括cJSON.h和cJSON.c两个文件,放入指定目录直接调用就可以了。

语法

1. 有一对基本的 {  }

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

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

4,数据有逗号分隔

5,花括号保存对象

6,方括号保存数组

示例

json中文文档:下载

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