1.5 XML的竞争对手

虽然XML如此优秀,而且具有如此广泛的应用场景,但不得不说的是,XML文档只是一份简单的文本文件,它的主要作用是进行平台无关的数据交换,如果有另一种更简洁易用的数据交换格式,那XML自然就会面临巨大的挑战。

1.5.1 Java的Annotation

从JDK 1.5起,Java开始支持Annotation,通过使用Annotation,Java允许在源码中添加一些额外的信息,这样就可以将原来需要使用XML文档指定的配置信息以Annotation来指定。因此在Java EE领域,Annotation就成为XML的挑战者。以前,几乎所有的Java框架都会采用XML作为配置描述文件,所以才会有人说“Java和XML是天生一对”。

自从Annotation开始大行其道之后,许多Java框架都提出了所谓的“零配置”概念,有些初学者把所谓的“零配置”想得过于复杂,其实没有必要。笔者常常说:如果你会使用XML配置文件进行配置管理,那么你一定会使用“零配置”方式进行配置管理——因为它们二者的实质是一样的,指定的配置信息也是一样的,只是指定配置信息的方式有所区别而已。

下面以一个Struts 2的Action类为例,详细分析Annotation和XML配置文件之间的对应关系。先看如下Action类:

alt

alt

alt

上面的Action类里包含了大量的Annotation,这些Annotation指定了该Action的部署信息,Struts 2框架将根据这些部署信息来部署该Action。

实际上,上面的Annotation完全可以改为如下XML文件:

alt

对比上面两种形式为Action指定的部署信息,读者不难发现它们二者所包含的有效信息完全一样,所存在的区别只是指定部署信息的方式不同而已。由于Java本身具有很好的跨平台特性,当把配置信息以Annotation的形式写在Java文件中时,这些配置信息将由各自平台上的虚拟机负责读取,从而可解决跨平台的配置问题。


alt提示

关于上面的Action配置以及Action代码中的Annotation的详细意义,请参考《Struts 2.1权威指南》一书。


相比之下,使用Java Annotation比使用XML进行配置管理更加简洁,而且可以将Java组件和配置信息集中管理,开发者只需打开Java源文件即可同时管理该组件的代码和配置信息。因此,目前许多主流Java框架,如Spring、Hibernate和Struts 2等,都支持使用Annotation进行配置管理。

1.5.2 轻量级的数据交换格式——JSON

JSON的全称是JavaScript Object Notation,即JavaScript对象符号,它是一种轻量级的数据交换格式。JSON数据格式既适合开发者进行读写,也适合计算机本身来解析和生成。最早的时候,JSON是JavaScript的数据交换格式,后来慢慢发展成一种与语言无关的数据交换格式,这一点非常类似于XML。

JSON主要在类似于C的编程语言中广泛使用,这些语言包括C、C++、C#、Java、JavaScript、Perl和Python等。JSON提供了在多种语言之间完成数据交换的能力,因此,也是一种非常理想的数据交换格式。JSON主要有如下两种数据结构:

alt 由key-value对组成的数据结构。这种数据结构在不同的语言中有不同的实现:例如在JavaScript中是一个对象,在Java中是一种Map结构,在C语言中则是一个struct,在其他语言中可能为record、dictionary、hash table等。

alt 有序集合。这种数据结构在不同语言中可能有list、vector、数组和序列等实现。

上面的两种数据结构,在各种不同的语言中都有对应的实现。因此,这种简便的数据表示方式完全可以跨语言,作为程序设计语言中通用的数据交换格式。在JavaScript中主要有两种JSON语法,一种用于创建对象,另一种用于创建数组。

1.5.2.1 使用JSON语法创建对象

JSON语法创建的对象更像一种Map结构,它是一种由key-value对组成的数据结构。图1.14显示了这种语法示意。

alt

图1.14 使用JSON语法创建对象

如图所示,创建对象object时,总以{开始,以}结束,对象的每个属性名和属性值之间以英文冒号(:)隔开,多个属性定义之间以英文逗号(,)隔开。语法格式如下:

alt

必须注意的是,并不是每个属性定义后面都有英文逗号(,),只有后面还有属性定义时才需要逗号。例如下面的对象定义是错误的。

alt

因为gender属性定义后多出了一个英文逗号,最后一个属性定义的后面应直接以}结束,而不再有英文的逗号。

当然,使用JSON语法创建JavaScript对象时,属性值不仅可以是普通字符串,也可以是任何基本数据类型,还可以是函数、数组,甚至是另外一个用JSON语法创建的对象,例如:

alt

1.5.2.2 使用JSON语法创建数组

用JSON语法创建数组也是非常常见的,图1.15是用JSON创建数组的语法示意。

alt

图1.15 使用JSON创建数组的语法示意

如图所示,JSON创建数组总以英文方括号([)开始,然后依次放入数组元素,元素与元素之间以英文逗号隔开,最后一个数组元素后面不需要英文逗号,以英文反方括号(])结束。使用JSON创建数组的语法格式如下:

alt

与JSON语法创建对象相似的是,数组的最后一个元素后面不能有逗号。

根据上面的介绍可以知道,XML语法和JSON语法之间可以非常方便地相互转换。假设有如下XML文档:

alt

上面的XML文档中包含了两本图书,每本图书都有各自的书名、作者和价格等信息,该文档可用于在不同程序间传递这两本图书的信息。实际上,使用JSON同样可以传递这两本图书的信息,只需定义如下JSON对象即可:

alt

对比两种数据交换格式,JSON格式比XML格式更加简洁,数据传输量也更小。当然,相比于XML格式的数据交换,JSON格式的数据交换丢失了一些信息,但丢失的这些信息影响不大,因此JSON格式的数据交换对XML格式的数据交换也是一种强有力的冲击。