JSON概述

  JSON: JavaScript 对象表示法( JavaScript Object Notation) 。是一种轻量级的数据交换格式。 它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式, 但是也使用了类似于C语言家族的习惯( 包括C、 C++、 C#、 Java、 JavaScript、 Perl、 Python等) 。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写, 同时也易于机器解析和生成(一般用于提升网络传输速率)。
  JSON 解析器和 JSON 库支持许多不同的编程语言。 JSON 文本格式在语法上与创建 JavaScript 对象的代码相同。 由于这种相似性, 无需解析器, JavaScript 程序能够使用内建的 eval() 函数, 用 JSON 数据来生成原生的 JavaScript 对象。
  JSON 是存储和交换文本信息的语法。 类似 XML。 JSON 比 XML 更小、 更快, 更易解析。
  JSON 具有自我描述性, 语法简洁, 易于理解。

JSON语法说明

  先来看一个简单的JSON

 1 {
2 "stars": [
3 {
4 "name": "Faye",
5 "address": "北京"
6 },
7 {
8 "name": "andy",
9 "address": "香港"
10 },
11 {
12 "name": "eddie",
13 "address": "台湾"
14 },
15
16 ]
17 }

    JSON 语法是 JavaScript 对象表示法语法的子集。数据在键/值对中;数据由逗号分隔;花括号保存对象, 也称一个文档对象;方括号保存数组, 每个数组成员用逗号隔开, 并且每个数组成员可以是文档对象或者数组或者键值对 。

JSON基于两种结构:
    “名称/值”对的集合(A collection of name/value pairs)。不同的编程语言中,它被理解为对象(object),纪录(record),结构(struct),字(dictionary),哈希表(hashtable),有键列表(keyed list),或者关联数组 (associative array)。
    值的有序列表(An ordered list of values)。在大部分语言中,它被实现为数组(array),矢量(vector),列表(list),序列(sequence)。

JSON的三种语法:

    键/值对 key:value,用半角冒号分割。 比如 "name":"Faye" 
    文档对象 JSON对象写在花括号中,可以包含多个键/值对。比如{ "name":"Faye" ,"address":"北京" }。 
    数组 JSON 数组在方括号中书写: 数组成员可以是对象,值,也可以是数组(只要有意义)。 {"love": ["乒乓球","高尔夫","斯诺克","羽毛球","LOL","撩妹"]}

附cJSON库下载地址 https://github.com/DaveGamble/cJSON

cJSON库在使用的时候只需要如下两步:将cJSON.c(或者库文件) 和 cJSON.h添加到项目中即可;如果在命令行中进行链接 还需要加上-lm 表示链接math库 .


C语言函数库写JSON文件 :

    从缓冲区中解析出JSON结构:extern cJSON *cJSON_Parse(const char *value); 
        解析一块JSON数据返回cJSON结构, 在使用完之后调用cJSON_Delete函数释放json对象结构。

    将传入的JSON结构转化为字符串 :extern char *cJSON_Print(cJSON *item); 
        可用于输出到输出设备, 使用完之后free(char *) 。

    将JSON结构所占用的数据空间释放 :void cJSON_Delete(cJSON *c)

    创建一个值类型的数据 :extern cJSON *cJSON_CreateNumber(double num);
                extern cJSON *cJSON_CreateString(const char *string);
                extern cJSON *cJSON_CreateArray(void);

    创建一个对象(文档) :extern cJSON *cJSON_CreateObject(void);

    数组创建以及添加 :cJSON *cJSON_CreateIntArray(const int *numbers,int count);
              void cJSON_AddItemToArray(cJSON *array, cJSON *item);

    JSON嵌套 :

          【 向对象中增加键值对】 cJSON_AddItemToObject(root, "rows", 值类型数据相关函数());
          【 向对象中增加数组】 cJSON_AddItemToObject(root, "rows", cJSON_CreateArray());
          【 向数组中增加对象】 cJSON_AddItemToArray(rows, cJSON_CreateObject());

    几个能提高操作效率的宏函数 :#define cJSON_AddNumberToObject(object,name,n) \
                        cJSON_AddItemToObject(object, name,cJSON_CreateNumber(n))
                   #define cJSON_AddStringToObject(object,name,s)\
                        cJSON_AddItemToObject(object, name, cJSON_CreateString(s))


C语言库函数解析JSON文件 :

    根据键找json结点 :extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string)

    判断是否有key是string的项 如果有返回1 否则返回0 :extern int cJSON_HasObjectItem(cJSON *object,const char *string)
                      { return cJSON_GetObjectItem(object,string)?1:0; }

    返回数组结点array中成员的个数 :extern int cJSON_GetArraySize(cJSON *array);

    根据数组下标index取array数组结点的第index个成员 返回该成员节点 :extern cJSON *cJSON_GetArrayItem(cJSON *array,int index);

    遍历数组 :#define cJSON_ArrayForEach(pos, head)        for(pos = (head)->child; pos != NULL; pos = pos->next)   


我们先来小试牛刀,编写一个输出到屏幕的简单json结构,代码1如下:

 1 #include<stdio.h>
2 #include<stdlib.h>
3 #include"cJSON.h"
4
5 int main(void)
6 {
7 char *data = "{\"love\":[\"LOL\",\"Go shopping\"]}";
8 //从缓冲区中解析出JSON结构
9 cJSON * json= cJSON_Parse(data);
10
11 //将传入的JSON结构转化为字符串 并打印
12 char *json_data = NULL;
13 printf("data:%s\n",json_data = cJSON_Print(json));
14
15 free(json_data);
16 //将JSON结构所占用的数据空间释放
17 cJSON_Delete(json);
18 return 0;
19 }

如下所示编译程序,执行程序,可以看到屏幕输出一个简单的json结构

下面我们在改进一下程序,输出到屏幕的同时,生成对应的json文件,代码2如下:

 1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 #include"cJSON.h"
5
6 int main(void)
7 {
8 char *char_json = "{\"habit\":\"lol\"}";
9 //从缓冲区中解析出JSON结构
10 cJSON *json = cJSON_Parse(char_json);
11 //将传入的JSON结构转化为字符串 并打印
12 char *buf = NULL;
13 printf("data:%s\n",buf = cJSON_Print(json));
14 //打开一个exec.json文件,并写入json内容
15 FILE *fp = fopen("exec.json","w");
16 fwrite(buf,strlen(buf),1,fp);
17
18 fclose(fp);
19 free(buf);
20 cJSON_Delete(json);
21 return 0;
22 }

如下图所示进行编译,执行程序,查看生成的对应的json文件

下面我们生成一个生成一个json结构稍微复杂一点的json文件,代码3如下:

 1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 #include"cJSON.h"
5
6 int main(void)
7 {
8 //创建一个空的文档(对象)
9 cJSON *json = cJSON_CreateObject();
10
11 //向文档中增加一个键值对{"name":"王大锤"}
12 cJSON_AddItemToObject(json,"name",cJSON_CreateString("王大锤"));
13 //向文档中添加一个键值对
14 //cJSON_AddItemToObject(json,"age",cJSON_CreateNumber(29));
15 cJSON_AddNumberToObject(json,"age",29);
16
17 cJSON *array = NULL;
18 cJSON_AddItemToObject(json,"love",array=cJSON_CreateArray());
19 cJSON_AddItemToArray(array,cJSON_CreateString("LOL"));
20 cJSON_AddItemToArray(array,cJSON_CreateString("NBA"));
21 cJSON_AddItemToArray(array,cJSON_CreateString("Go shopping"));
22
23 cJSON_AddNumberToObject(json,"score",59);
24 cJSON_AddStringToObject(json,"address","beijing");
25
26 //将json结构格式化到缓冲区
27 char *buf = cJSON_Print(json);
28 //打开文件写入json内容
29 FILE *fp = fopen("create.json","w");
30 fwrite(buf,strlen(buf),1,fp);
31 free(buf);
32 fclose(fp);
33 //释放json结构所占用的内存
34 cJSON_Delete(json);
35 return 0;
36 }

编译程序,执行程序,查看生成的json文件

下面再来编写一个,代码4如下:

 1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 #include"cJSON.h"
5
6 int main(void)
7 {
8 //先创建空对象
9 cJSON *json = cJSON_CreateObject();
10 //在对象上添加键值对
11 cJSON_AddStringToObject(json,"country","china");
12 //添加数组
13 cJSON *array = NULL;
14 cJSON_AddItemToObject(json,"stars",array=cJSON_CreateArray());
15 //在数组上添加对象
16 cJSON *obj = NULL;
17 cJSON_AddItemToArray(array,obj=cJSON_CreateObject());
18 cJSON_AddItemToObject(obj,"name",cJSON_CreateString("Faye"));
19 cJSON_AddStringToObject(obj,"address","beijing");
20 //在对象上添加键值对
21 cJSON_AddItemToArray(array,obj=cJSON_CreateObject());
22 cJSON_AddItemToObject(obj,"name",cJSON_CreateString("andy"));
23 cJSON_AddItemToObject(obj,"address",cJSON_CreateString("HK"));
24
25 cJSON_AddItemToArray(array,obj=cJSON_CreateObject());
26 cJSON_AddStringToObject(obj,"name","eddie");
27 cJSON_AddStringToObject(obj,"address","TaiWan");
28
29 //清理工作
30 FILE *fp = fopen("create.json","w");
31 char *buf = cJSON_Print(json);
32 fwrite(buf,strlen(buf),1,fp);
33 fclose(fp);
34 cJSON_Delete(json);
35 return 0;
36 }

编译执行程序,效果如下图所示:

写了这么多生成xml的例子,下面我们来一个解析的例子,代码5如下:

 1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 #include"cJSON.h"
5
6 int main(void)
7 {
8 char *string = "{\"family\":[\"father\",\"mother\",\"brother\",\"sister\",\"somebody\"]}";
9 //从缓冲区中解析出JSON结构
10 cJSON *json = cJSON_Parse(string);
11 cJSON *node = NULL;
12 //cJOSN_GetObjectItem 根据key来查找json节点 若果有返回非空
13 node = cJSON_GetObjectItem(json,"family");
14 if(node == NULL)
15 {
16 printf("family node == NULL\n");
17 }
18 else
19 {
20 printf("found family node\n");
21 }
22 node = cJSON_GetObjectItem(json,"famil");
23 if(node == NULL)
24 {
25 printf("famil node == NULL\n");
26 }
27 else
28 {
29 printf("found famil node\n");
30 }
31 //判断是否有key是string的项 如果有返回1 否则返回0
32 if(1 == cJSON_HasObjectItem(json,"family"))
33 {
34 printf("found family node\n");
35 }
36 else
37 {
38 printf("not found family node\n");
39 }
40 if(1 == cJSON_HasObjectItem(json,"famil"))
41 {
42 printf("found famil node\n");
43 }
44 else
45 {
46 printf("not found famil node\n");
47 }
48
49 node = cJSON_GetObjectItem(json,"family");
50 if(node->type == cJSON_Array)
51 {
52 printf("array size is %d",cJSON_GetArraySize(node));
53 }
54 //非array类型的node 被当做array获取size的大小是未定义的行为 不要使用
55 cJSON *tnode = NULL;
56 int size = cJSON_GetArraySize(node);
57 int i;
58 for(i=0;i<size;i++)
59 {
60 tnode = cJSON_GetArrayItem(node,i);
61 if(tnode->type == cJSON_String)
62 {
63 printf("value[%d]:%s\n",i,tnode->valuestring);
64 }
65 else
66 {
67 printf("node' type is not string\n");
68 }
69 }
70
71 cJSON_ArrayForEach(tnode,node)
72 {
73 if(tnode->type == cJSON_String)
74 {
75 printf("int forEach: vale:%s\n",tnode->valuestring);
76 }
77 else
78 {
79 printf("node's type is not string\n");
80 }
81 }
82 return 0;
83 }

编译程序,执行程序,解析出json信息如下图所示,


  

关于更多的json学习,可以自己根据提供的cJSON.h cJSON.c进行深入的学习,学无止境,我这里就介绍到这里了。

转自:http://www.cnblogs.com/liunianshiwei/p/6087596.html

JSON的简单介绍以及C语言的JSON库使用的更多相关文章

  1. 腾讯云数据库团队:MySQL5.7 JSON实现简单介绍

    作者介绍:吴双桥 腾讯云project师 阅读原文.很多其它技术干货.请訪问fromSource=gwzcw.57435.57435.57435">腾云阁. 本文主要介绍在MySQL ...

  2. json-lib简单处理json和对json的简单介绍

    JSON 1.json是什么? *它是js提供的一种数据交换格式 2.json的语法 *{}:是对象! >属性名必须使用双引号括起来!单引号不行!!! >属性值: *null *数值 *数 ...

  3. Json的简单介绍和解析

    Json:JavaScript对象表示法(JavaScript Object Noatation) Json是存储和交换文本信息的语法,类似XML.它采用键值对的方式来组织,易于人们阅读和编写,同时也 ...

  4. 原生ajax接收json字符串(简单介绍)

    什么是json? JSON的全称是 Javascript Object Notation(javascript对象表示法),是基于javascript对象字面量,如果单从眼睛看,JSON里的数据是被保 ...

  5. JSON的简单使用_向前台发送JSON数据

    转自:http://www.cnblogs.com/digdeep/p/5574366.html 1.前台页面 <%@ page language="java" conten ...

  6. package.json参数简单介绍

    概述: 每个项目的根目录下都会有一个package.json文件,定义了项目所需的模块,以及项目信息.执行npm install 命令会自动下载package.json中配置的模块,也就是配置项目的运 ...

  7. JSON基础,简单介绍

    JSON(JavaScript Object Notation(记号.标记)) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - ...

  8. Python常用的库简单介绍一下

    Python常用的库简单介绍一下fuzzywuzzy ,字符串模糊匹配. esmre ,正则表达式的加速器. colorama 主要用来给文本添加各种颜色,并且非常简单易用. Prettytable ...

  9. Python的简单介绍

    0. 前言 最近在从头梳理Python的相关知识,有助于以后更好地学习新知识.这篇博客,我简单介绍一下Python语言的有关内容. 1. Python介绍 Python的创始人为荷兰人吉多·范罗苏姆( ...

随机推荐

  1. 不应直接存储或返回可变成员 Mutable members should not be stored or returned directly

    Mutable objects are those whose state can be changed. For instance, an array is mutable, but a Strin ...

  2. 虚拟机vmware如何进入bios设置,设置启动项(装系统时用)

    方法/步骤   1 打开你要进入Bios的虚拟系统界面(处于关机状态).我这里的是server2003. 2 鼠标点击上部的 虚拟机 菜单. 3 在弹出的菜单中鼠标点击 电源 . 4 在弹出的下一级菜 ...

  3. 【006】【JVM——垃圾收集器总结】

     Java虚拟机学习总结文件夹 JVM--垃圾收集器总结 垃圾收集器概览 收集算法是内存回收的方法论.垃圾收集据是内存回收的详细实现.Java虚拟机规范中对垃圾收集器应该怎样实现没有规定.不同的厂 ...

  4. Spring Cloud内置的Zuul过滤器详解

    Spring Cloud默认为Zuul编写并启用了一些过滤器,这些过滤器有什么作用呢?我们不妨按照@EnableZuulServer.@EnableZuulProxy两个注解进行展开,相信大家对这两个 ...

  5. sql server2000导出表结构说明

    SELECT 表名 then d.name else '' end, 表说明 then isnull(f.value,'') else '' end, 字段序号=a.colorder, 字段名=a.n ...

  6. ashx页面返回json字符串|jQuery 的ajax处理请求的纠结问题

    纠结,整了半天的jquery的ajax请求数据. 遇到的问题: 1 ajax方法一直进入error方法里,进入到请求的.ashx页面.这个问题,我未找到是什么原因.反正我使用了一下的代码,就好了. $ ...

  7. CSS中Zen Coding

    值别名 有几个常用的别名: p → % e → em x → ex 可以用这些别名来代替完整的单位: w100p → width: 100% m10p30e5x → margin: 10% 30em ...

  8. 本地存储localStorage以及它的封装接口store.js的使用

    本地存储localStorage以及它的封装接口store.js的使用 sublime-text chrome javascript readyGo 2016年11月20日发布   0 推荐 9 收藏 ...

  9. 部署openfire到linux环境下

    1.java环境部署:具体参考 http://blog.csdn.net/gufachongyang02/article/details/45337379 2.ant环境部署: 具体参考 http:/ ...

  10. Emacs文件命令

    [文件]----------------------------------------C-x C-f 读取文件到Emacs C-x r 只读的方式打开一个文件C-x C-q 清除一个窗口的只读属性 ...