如同人类通过交流相互合作,计算机网络中计算机的相互合作也依赖于彼此的信息交流。人类间的相互交流可以通过当面交流,电话,短信,邮件,IM应用来实现,但这建立在两人使用共同语言的基础上。计算机间可以以TCP等方式传输数据,但我们需要预定义一种为双方计算机所接受的“语言“,方能使数据交流正常进行,这种语言我们称之为”数据交换语言“。
基于数据交互的基础性,各种开发语言基本都提供了自身的数据交换功能或者对通用交换语言标准的接口。但在不同的系统不同的语言间交换数据时,我们一般倾向于使用无关于平台及语言的数据交换语言。此类语言主要包括XML,JSON,YAML,Protobuf等,常用于接口调用,配置文件,数据存储等场景。
JSON作为一种轻量级的,易于编写和阅读的数据交换语言在web开发中得到了越来越多的应用,本文将对JSON的历史,特点及语法进行简要介绍,并将其与XML语言进行横向对比,通过不同应用场景对数据交换语言的不同要求分析对数据交换语言的选择。
JSON历史
JSON全称为Java Object Notation( Java 对象表示法), 是基于Java Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。
JSON早在2000年就已经在使用了。2006年Douglas Crockford把JSON提交给IETF后,JSON开始作为Java的一个严格的子集得到推广。JSON用Java中的一些模式来表示结构化数据,这使得JSON对于Java开发者来说极为易读易写,极大地推动了JSON在web开发界的应用。目前JSON已被越来越多的API及Database选为输出的首选格式,在轻量级数据交换语言界独占鳌头。
JSON特点
1. JSON是一种轻量级的数据交换语言而非编程语言,其语法只支持字符串,数值,布尔值及null以及在此基础上的对象和数组。JSON轻量级的一部分体现即来源于此,因为JSON只处理了非常有限的数据类型,甚至没有一个日期数据类型。与之相对的重量级数据交换语言如XML则拥有更为复杂的数据类型及规则。有限的数据类型固然一定程度上限制了JSON在功能上的实现,却也使得JSON字符使用量极少,极大地降低了读写成本,特别适合互联网的数据传递。
2. JSON采用与编程语言无关的文本格式,任何编程语言只要按JSON的规则都能解析JSON,这使得JSON的跨平台传递效率极高。JSON同时采用了大量类C语言(C,C++,C#,Java,Java,Perl,Python等)的语言习惯,使得其可读性极高,容易编写编译。
3. JSON是Java的一个子集,因而具有Java的原生支持。JSON可以用Java内建的方法直接进行解析,转换成Java也非常方便。
4. JSON不是完整的标记语言,这使得其拓展性及可检索性较低。
JSON语法
我们在上文提过, JSON其语法只支持字符串,数值,布尔值及null以及在此基础上的对象和数组。下面我们分别介绍其在JSON中的表达形式。
1. 对象
对象是一个无序的“键-值”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“键”后跟一个“:”(冒号);“键-值”之间使用“,”(逗号)分隔。
2. 数组
数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
3. 值
值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
具体的字符串和数值的实现与Javascipt非常类似,这里就不多展开了,下面给出几个JSON代码样例。
对python中dictionary熟悉的读者相信能很轻松地提取出其中的信息。JSON的解析工具浩如繁星,如Java中的eval()函数,这里也不详细展开了。
额外安利一个检验JSON格式的网址http://www.json.cn,不仅能在线检验JSON代码格式的正确,同时能够给出相应的修改意见。如果你的代码没有问题,还会自动帮你排版为更易读的版式,强迫症福音!
JSON与XML的对比
XML全称为extensible markup language,是一种类似于HTML的语言。XML没有预先定义的标签,使用DTD(document type definition)文档类型定义来组织数据,是业界公认的标准数据交换语言之一。
JSON与XML的区别主要包括:
1. 标记语言
JSON与XML最大的不同在于XML是一个完整的标记语言,而JSON不是。这使得XML在程序判读上需要比较多的功夫。XML利用标记语言的特性提供了绝佳的延展性(如XPath),在复杂数据存储,扩展及高级检索方面具备对JSON的优势,但同时也意味着冗余信息较多。对于需要高性能交互的应用,过多的冗余信息则成了缺点。
2. 字符占用量
XML由于其标记语言的特性具有大量的冗余信息,这使得其字符占用量超过同等信息量的JSON文件。以下我们提供一个例子:
为了提供一个人的相关信息,我们先以XML语言编写相关文件:
然后我们再以JSON文件编写一次:
可以看出,字符数仅为XML编码所用约1/2。
3. 编译方式
XML主流的编译方式包括DOM, SAX,JDOM 和DOM4J四种,DOM拥有较强的遍历能力和检索能力,但需要将文件整体读入内存进行处理,对计算机性能和内存的要求较高。SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。 而目前JSON的编译方式还比较单一,与DOM较为类似。因而在大规模数据的处理上有一定劣势。
JSON vs XML -- 应用场景分析
从以上分析我们可以得出,JSON由于其非标记语言的设计思路具有字符利用率高,解析速度快的优点,而XML作为一种完整的标记语言虽然继承了标记语言的冗余度,在读写成本上逊色于JSON,但在数据的检索与复用上对JSON有较大的优势。下面我们就不同的应用场景分析对JSON和XML的选择。
1. 开放式平台
此类应用场景实例包括微博,Facebook等。此类场景的特点是:
1. 调用方不完全可控,而且是针对公网的,你可能不知道是谁、是什么语言、是什么方式在调用你提供的数据接口;
2. 接口访问量一般都非常大,要求具有很高的性能和吞吐量;
3. 需要考虑安全问题,外部提交的数据可能不是合法的。
所以在这种情况下,需要考虑数据传输的带宽消耗和数据交换协议的易用性,以及多语言支持程度。以前对于html页面使用的Java接口调用一般都使用XML格式,最近几年几乎都转成了JSON格式了,因为JSON传输量更小,比XML更加容易使用。 而对于开放平台,由于使用的场景很多,所以需要提供多种交换协议格式。基本上都会提供XML和JSON。
大型互联网公司像Twitter, Facebook和LinkedIn的很多原始数据仍然使用XML而不是JSON存储,像可编程Web和其他数据表明,XML仍然是API的主要数据格式,但是“大JSON”正在快速上升。 Twitter的API大约两年前开始就只支持JSON了。Foursquare也跟进了。
有业界人士表示:“当涉及到数据API服务时, XML仍然是最常用的格式,但JSON是的增长更快。尽管还有很多XML格式的API,但最近的API ,越来越倾向于使用JSON格式。这样的例子还有很多…… 企业正在迅速从XML迁移到JSON。”
2. 内部服务
对于一个大型系统来说,内部服务的数据交换无处不在。从最基本和常见的数据库数据交换、memcached缓存数据交换、消息队列的数据交换到系统之间使用的RPC服务框架等等,都可以算作内部服务的数据交换。
内部服务的特点是不用考虑防火墙,不对外开放,速度快(基本无带宽成本)。
内部服务的数据交换协议的选择空间非常大,一般需要考虑:
1. 数据交换语言的性能
2. 是否需要跨语言支持
3. 数据交换协议的消息体大小
以数据库为例,传统数据库如Oracle,Postgres等均支持XML,因为在数据量的吞吐上数据交换语言的性能及消息体大小并不会成为瓶颈,同时传统关系型数据库对数据的可检索性及复用性要求较高,这使得XML成为一种理想的选择。
而随着大数据和NoSQL型数据库的发展,JSON在数据库上的应用越来越普遍,因为
1. JSON的设计思路就是从存储无关系数据的角度出发的,这与NoSQL型数据库的设计出发点相符;
2. 大数据时代数据规模的激增及分布式存储使得数据交换语言的性能及消息体大小成为制约数据库性能的极大瓶颈。
这是有很多知名的例子,像MongoDB,CouchDB,和Riak。这三种数据库都基于JSON,横向可扩展,由Web驱动。
其他的例子比比皆是:亚马逊DynamoDB的架构是完全基于REST/JSON的。 Neo4j,图形数据库,有一个REST/JSON API,没有对应XML的支持。 HBase的的REST架构目前支持XML,但这种支持正走在被废弃的路上。
结语
JSON作为一种轻量级的数据交换语言,因其较低的读写成本,较好的跨平台性以及其数据结构与当前数据交流要求的契合在web大数据时代得到了越来越广泛的应用。但JSON并不是尽善尽美的,从其语法结构的设计我们可以看出JSON是基于”键-值“型数据的一种较为简单的数据交换语言,单一的数据结构在提供了较低读写成本的同时也使得JSON的检索效率及可复用性较差,使其在复杂关系性数据的存储上具有一定劣势。在实际应用中我们仍需根据数据类型,硬件性能及数据交流实际需求在以JSON为代表的轻量级数据交换语言和以XML为代表的重量级数据交换语言间做出合理的选择。
参考
软件系统开发中的数据交换协议
http://www.infoq.com/cn/news/2011/05/sl-data-exchange-protocol
联系客服