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. asp.net 中用easyui中的treegird的简单使用

    几乎每个‘数人头’项目中都会用到的功能,这里先记下来,以后直接到这里复制代码就行了,ASP.NET MVC中的使用 数据库用户表中的除了有个parentid父级ID外,我还多加了以个字段,parent ...

  2. Atitit 面试问题总结

    Atitit 面试问题总结 1. 面试约人阶段可以预先1俩分钟大概问下情况1 2. 自我介绍阶段1 3. 技术方面2 3.1. 界面方面2 3.2. Java 本身   了解spring mybati ...

  3. vue全面介绍

    Vue.js 是一个JavaScriptMVVM库,是一套构建用户界面的渐进式框架.它是以数据驱动和组件化的思想构建的,采用自底向上增量开发的设计.相比于Angular.js,Vue.js提供了更加简 ...

  4. flexb布局图解

  5. 行为类模式(九):策略(Strategy)

    定义 针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. UML 优点 策略模式提供了管理相关的算法族的办法.策 ...

  6. Debugging the Java HotSpot VM

    Open Heart Surgery: Analyzing and Debugging the Java HotSpot VM at the OS Level https://www.youtube. ...

  7. mysql++ result

    在介绍Result之前,先熟悉几个类 Field  用来存储SQL字段信息,主要是关于表字段列属性的判断和获取 class Field { public: ...................... ...

  8. python(45)内置函数:os.system() 和 os.popen()

    os.system() 和 os.popen() 概述 os.popen() 方法用于从一个命令打开一个管道. 在Unix,Windows中有效 语法 popen()方法语法格式如下: os.pope ...

  9. c++ primer读书笔记之c++11(三)

    1 =default构造函数限定符 c++11针对构造函数提供了=default限定符,可以用于显式指定编译器自动生成特定的构造函数.析构或赋值运算函数.参考代码如下: class CtorDftTy ...

  10. visual c++中预定义的宏

    一.主要目标 (由于visual studio通常包含很多开发环境,通常将其中c/c++的ide称为visual c++ 20xx) 整理下visual c++ 2010下预定义的宏.做一下备忘和了解 ...