作者:冉渊 字数:5059 点击:

摘 要:在Web开发中,如何选择一种适当的数据传输格式是一个非常重要的问题。目前,主流的数据传输格式主要是XML和 JSON二种。在满足基本需求的情况下,如何选择更高效、安全的一种传输格式就显得尤其重要。

本文将对这二种传输格式的结构进行阐述,并对比其数据传输效率及安全性,让读者在开发过程中选择数据传输格式有一个参考的方向。

关键字:JSON;XML;数据传输;效率;安全性

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。

XML是Extensible Markup Language 的缩写,中文名称是可扩展标记语言,它源自标准通用标记语言SGML。XML 是一种格式统一,跨平台的语言,早已成为业界的标准。XML 使用元素和属性来描述数据。在数据传送过程中,XML 始终保留了诸如父/ 子关系这样的数据结构。几个应用程序可以共享和解析同一个XML 文件,不必使用传统的字符串解析或拆解过程。相反,普通文件不对每个数据段做描述(除了在头文件中),也不保留数据关系结构。使用XML 做数据交换可以使应用程序更具有弹性,因为可以用位置(与普通文件一样) 或用元素名(从数据库)来存取XML 数据。

1 JSON和XML的结构

1.1 XML结构

XML 文档形成了一种树结构,它从“根部”开始,然后扩展到“枝叶”。XML 使用简单的具有自我描述性的语法。XML 文档必须包含根元素,该元素是所有其他元素的父元素。XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。父、子以及同胞等术语用于描述元素之间的关系。父元素拥有子元素。相同层级上的子元素成为同胞(兄弟或姐妹)。所有元素均可拥有文本内容和属性(类似 HTML 中)。所有元素均可拥有子元素。一个典型的XML结构如下:

1

a1

http://a1.baidu.com

hello

2

a2

http:// a2.baidu.com

world

1.2 JSON结构

JSON 中的每个结构单元均由花括号( { } ) 表示, 每个结构中可以含有多个由逗号( , ) 分隔的成员, 而每个成员均是一个名称/ 值对。每个名称/ 值对包含由冒号( : ) 分隔的两部分, 前者是名称, 后者是值。值不仅可以是普通的数字、字符串, 也可以是逻辑值(Ture或False),一个有序列表, 用方括号( [ ] ) 表示, 其中可以包含以逗号分隔的多个值[ ] 。如上例中的XML结构可以用JSON结构表示为:

{comment s:[

{

id:1,

author:"a1",

url:"http://a1.baidu.com" ,

content: "hello"

},

{

id B2,

author : "a2" ,

url:"http://a2.baidu.com" ,

content:"world"

},

] }

2 传输效率对比

2.1 传输开销对比

数据传输过程中的开销主要来源于属性名称、标签及符号。以一个简单的数据表为例,每一列即为一个属性,如图1 所示。

图1 数据表

XML 分为无空属性XML 和含空属性XML 两类。若用XML 描述第一条数据记录的Tel 属性,可表示为123。对于无空属性XML,即当属性值为空时,不创建元素,数据传输开销表示为(2*N+5)*(1-E),5表示开关标签符号‘( ’,‘/’)共5 个。对于含空属性XML,即属性值为空,但标签及属性名称仍然保留,若第一条数据记录的Tel 属性值为空,则用XML 可表示为 ,此时相当于E = 0,XML 数据传输开销为2*N+5。

对于JSON,也分为无空属性JSON 和含空属性JSON 两类。若用JSON 表示第一条数据记录,可表示为{“No”:“1”,“Sex”:“female”,“Tel”:“123”,“Age”:“10”}。对于每个属性由于属性名称无需成对出现,只需一个表示,另外包含符号‘( "’,‘"’,‘:’,‘,’)共6 个,因此,无空属性JSON(当属性值为空时,不创建元素),数据传输开销可表示为(N+6)*(1-E)。对于含空属性JSON(属性值为空,但标签仍然保留),若第一条数据记录的Tel 属性值为空,则可表示为{“No”:“1”,“Sex”:“female”,“Tel”“: ”“, Age”“: 10”},即E = 0时,JSON数据传输开销为N+6。

2.2 解析速度对比

使用Javascript 解析XML 和JSON 的速度也是比较的项目之一。假定用XML 和JSON 分别描述1000 条employee 记录,使用Javascript 遍历这1000 记录并且读取name,title,phone 和Email4个属性。测试结果如下:

①IE8 JSON:77ms;XML: 770ms

②Fire Fox 3 JSON:68ms;XML:198ms

③Safari 4 JSON:69ms;XML:827ms

④Chrome 10 JSON:72ms;XML: 810ms

虽然上述测试结果与测试机的软硬件配置有关,但是解析的速度分属于两个数量级,很明显,Javascript 解析JSON 的速度远远快于解析XML。

2.3 反序列化效率对比

从服务器端传输过来JSON 或XML 的数据将被反序列化才能获取其中的数据,进而显示在客户端页面上。其中,XML 是基于DOM 树结构的,反序列化XML 需要考虑父节点和子节点,这为反序列化增加了难度。如下是一个典型的XML 格式表示:

lucy

2009021125

female

反序列化XML 通常采用如下方式:

var student=request.responseXML;

var name=book.getElementsByTagName("name");

alert(name[0].firstChild.textContent);

而JSON 只需要通过JavaScript 语言的eval( )函数就可以将JSON 数据反序列化为JavaScript 对象。如下是上述XML示例对应的JSON 格式:

{

"name":lucy,

"stuno":2009021125,

"sex":female

}

反序列化JSON 通常采用如下方法:

var student=eval(request.responseText);

alert(student.name);

显然,JSON反序列化的效率高于XML反序列化的效率,这是因为采用JSON格式的数据大大降低了反序列化时的冗余度,使反序列化效率提高。

经过以上分析可以看出,JSON格式的数据传输效率要比XML格式高。使用JSON 不仅减少了XML 解析带来的便利性能问题和兼容性问题, 而且对于JavaScript 来说非常容易使用, 可以通过遍历数组以及访问对象属性来获取数据, 基本具备了结构化数据的性质。Google maps 就没有采用XML 传递数据, 而是采用了JSON 方案。JSON 的优势还表现在它的非冗长性上。在XML 中, 打开和关闭标记是必需的, 这样才能满足标记的依从性; 而在JSON 中, 所有这些要求只需通过一个简单的括号即可满足。在包含有数以百计字段的数据交换中, 传统的XML 标记将会延长数据交换时间。

3 安全性对比

3.1 JSON安全性

JSON在安全性方面相对薄弱,JSON只能用于可公开的数据,其他数据都不能使用JSON,除非你使用的URL无法预测,JSON才是安全的。

这里有两个问题:一个是CSRF(Cross Site Request Forgery,跨站点伪造请求攻击),它允许攻击者绕过基于cookie的身份认证。另外,维基百科也说到了这个,你可以用CSRF在一个远程服务器上调用由cookie保护着的数据。黑客可以利用这项技术把别人银行账号里的钱转到他的账户中。

还有一种则鲜为人知,那就是JSON/数组攻击,这可以让某个用户在Mozilla上偷取JSON数据,其实只要是任何使用当代的JavaScript解释器的平台都会都可以实施该攻击。

由于 JSON 是 JavaScript 的子集,所以一般都会使用 eval() 作为读取数据的方式,如果是针对可靠的数据来源,在不支持原生 JSON 解析的浏览器上面这是最快速的方法。然而由于 eval 方法同样可以执行任意的 JavaScript 代码,因此当数据来源不可靠时则可能产生安全性问题。

其中一种防止不安全代码出现的解决办法,是通过浏览器原生支持的 JSON.parse(str) 方法读取 JSON 数据,目前已经得到大部分主流浏览器的支持(IE8+,Firefox 3.5+,Chrome4+/Safari4+,Opera10+),在不支持原生 JSON 对象的浏览器上面可以使用 parseJSON 方法进行读取[1],parseJSON 采用解析器验证读入的代码是否真的是 JSON 代码,这样就提供了较好的安全性。

另外一个安全上的问题则是跨站请求伪造。这个问题在Javascript中的状况是,由于Javascript采用了称为“沙盒”的机制,它限制Javascript引擎仅能引入同一个站点的代码,因而某种程度上提高了安全性。

3.2 XML安全性

XML被设计用来存储和传输数据,任何平台上的程序都可以通过使用XML解析器来处理XML数据,不仅仅是web应用,还包括数据库软件、浏览器等等。由于XML的覆盖面广,很多软件都是使用的同一款XML解析库,如果这套解析库存在漏洞,那么无疑又将影响的范围扩大了。

在XML解析的过程中,最常见的有三种漏洞:

◆拒绝服务漏洞

◆XML注入

◆XML外部实体注入

但是可以通过XML加密,XML签名,XML密钥等手段来保证XML的安全性。

通过上面的分析我们可以看出:就安全性而言,由于大部分Javascript库都是使用eval()来解析数据,存在执行恶意JSON数据的安全漏洞;当然可以使用专门的JSON解析器来避免这个问题。相比,XML更安全一些。

4 结语

XML 和JSON 作为主要的数据交换格式,择适合的数据交换格式对今后的数据转换和应用程序性能至关重要。通过上面的对比不难看出, JSON比XML更加适合在Web应用中作为数据交换格式使用。除此之外,JSON规范简单,易于学习,多种语言开发包使得它易于在项目中使用,无论是使用JavaScript还是其它编程语言,操作JSON的代码都相对较少。JSON在WEB服务与数据存储方面也有很大的发展空间。加上越来越多的AJAX应用的出现,JSON具有了更大的发挥其魅力的舞台。正是如此,JSON已经逐渐成为了WEB开发者的首选数据传输格式。

参考文献

[1] JSON并没有人们想象中的那样安全,http://www.csharpwin.com/dotnetspace/1585.shtml

[2] 王照.XML安全性研究与实现[A].同济大学,2006.

[3] 高静、段会川. JSON 数据传输效率研究[A].计算机工程与设计,2011.

[4] 杨树林、胡洁萍.JSON数据交换格式及其在数据验证中的应用[A].北京印刷学院学报,2008.

[5] 胡千里.比较XML与JSON在Web中的应用[A].信息技术,,2011.

[6] JSON, http://zh.wikipedia.org/zh-cn/JSON#.E5.AE.89.E5.85.A8.E6.80.A7.E5.95.8F.E9.A1.8C

[7] JSON: The Fat-Free Alternative to XML, http://www.json.org/xml