高 静, 段会川
(山东师范大学信息科学与工程学院,山东济南250014)
选择一种合适的数据传输格式是Web开发不可忽视的问题,而数据传输效率是非常重要的一个指标,因此对不同数据传输格式的传输效率进行研究就显得尤为重要。目前,已有对XML和FSV格式的数据传输开销的研究[1],而JSON序列化机制因易于编码和便于机器解析而受到越来越多的关注,对JSON的数据传输开销仍未有研究。本文将对XML、FSV及JSON从数据传输开销、数据传输时间以及客户端数据反序列化效率3个角度进行比较研究,以求给开发者选择数据传输格式提供有力的参考依据。
JSON作为一种轻量级的数据传输格式,可以在多种语言之间进行数据交换。JSON易于阅读和编码,且它是JavaScript规范的子集,能被支持JavaScript的浏览器所解析,相比XML,减少了解析时带来的性能和兼容性问题,这些特性使JSON成为理想的数据交换语言。
JSON具有以下主要形式[2-3]:
(1)对象:是一个无序的“‘名称/值’对”集合。一个对象以“{”开始,“}”结束,每个“名称”后跟一个“:”,“名称”使用““””括起来“‘名称/值’”之间使用“,”将其分隔。图1是JSON创建对象的格式。
图1 对象格式
下面是一个简单示例:
var user={"username":"andy","age":"20","sex":"female"}
这个对象包含了3个元素username;age;sex,它们的值分别是 andy;20;female。
(2)数组:是值的有序集合。一个数组以“[”开始,“]”结束,值之间使用“,”将其分隔。图2是JSON创建数组的格式。
图2 数组格式
下面是一个简单示例:
var user=['lily','tom','sara']
这个例子表明,在数组user中包含3个元素‘lily’,‘tom’,‘sara’。
序列化(Serialization)是将对象状态转换为可保持或传输的格式的过程。与序列化相对的就是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据[4]。
首先服务器直接生成JavaScript语句,客户端获取后直接用eval方法来获得这个对象。
var mydate=eval("("+dd+")");
通过上面这条语句就可以将从服务器获得的JSON结果dd,转换为JSON对象mydate。需要注意的是,要在这个字符串两端套上小括号。然后客户端通过 JavaScript引擎中的eval()函数反序列化JSON响应序列,使之运行在客户的浏览器上。
数据传输过程中的开销主要来源于属性名称、标签及符号。以一个简单的数据表为例,每一列即为一个属性,如表1所示。
表1 数据表
RamonLawrence对XML及FSV数据传输的开销公式[1]已有研究,假设对于任一属性a,S表示a的最大模式(Schema),D表示a的数据值(Data),N表示属性名称(Name),E表示属性值为空(Empty)的部分所占的比例。则FSV数据传输的开销可表示为(S-D),即最大模式与数据值大小之差。
XML分为无空属性XML和含空属性XML两类。若用XML描述第一条数据记录的Tel属性,可表示为。对于无空属性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 数据传输开销计算公式
实验所引用的统计数据集[1]如表3所示。这是RamonLawrence由Java程序DBstats通过JDBC连接样例数据库得来,其中样例数据库来自MicrosoftAccess的Northwind数据库,以及UCI KDD和ML库,还有一些互联网上的公用数据库。数据集分为模式级和数据级,取得了数据级属性名称(N),模式(S)及数据值(D)等数值的大小,所取数据均保留两位有效数字。其中使用比例(D/S)表示数据值占模式大小的比例,未用比例(E)表示属性值为空的部分所占的比例。
表3 统计数据集
由表中数据可发现,各数据库属性名称(N)平均值大约为8,模式大小(S)平均值大约为20,数据值(D)平均值大约为7,数据值占模式大小的比例(D/S)平均值大约为40%,而属性值为空的部分所占比例平均值大约为7%,这些数据对于分析数据传输开销具有重要意义。为更直观地表示,各样例数据库属性名称(N)、模式(S)及数据值(D)用折线图如图3所示。
图3 样例数据库属性名称、模式、数据值比较
将上节中统计数据集的数据利用表2中各数据传输格式开销公式计算,得到不同数据传输格式开销,将数据进行整理如表4所示(表中数据均保留两位有效数字)。
由于各样例数据库数据记录集较大,实验数据具有较强的精确性,而经过对同一数据库数据记录的不同数据传输格式传输,可以得到较为公正的结果。
表4中,以Northwind数据库为例,已知N=8.96,S=15.24,D=6.86,则FSV数据传输开销为S-D=8.38,含空属性XML数据传输开销为2*N+5=22.92,无空属性XML数据传输开销为(2*N+5)*(1-E)=22.29,含空属性JSON数据传输开销为N+6=14.96,无空属性JSON数据传输开销为(N+6)*(1-E)=14.55。以此类推,得到不同数据传输格式的开销。为便于直观比较,将不同数据传输格式的开销以条形图形式表示如图4所示。
表4 不同数据传输格式开销量化比较
图4 不同数据传输格式开销直观比较
从以上图表中可以看出:
(1)含空属性JSON的开销平均值为13.58,无空属性JSON的开销平均值为12.61,两者之间相差0.97,均明显小于任何一种XML的数据传输开销平均值(20.16或18.73)。其中含空属性JSON比含空属性XML的开销小6.58,无空属性JSON比无空属性XML的开销小6.12。这正是JSON简洁的数据描述格式相比XML复杂的格式标签所带来的优势。
(2)FSV格式的开销平均值为13.83,两种JSON格式的数据传输开销平均值均略低于FSV。
综上,JSON的数据传输开销是各数据传输格式中最小的。而数据传输开销的减小必然会带来数据传输效率的提高。虽然JSON的数据传输开销与FSV相差无几,但值得一提的是,JSON以其简洁的编码形式在数据描述方面明显优于FSV。因此,JSON相比较XML与FSV,在数据传输开销和数据描述简洁性方面均成为一种理想的数据传输格式。
为了更好的验证JSON的数据传输效率优于其他数据传输格式,我们搭建一个实测环境,实验通过对不同数据传输格式传输同一组数据库记录的时间进行比较,间接地比较了数据传输效率。由于网络环境不稳定等原因,实验数据会有一些波动,经过10次测试取平均值。实验结果如表5所示。
表5 数据传输效率比较
经过分析表格中数据,大体上来看,以JSON格式传输数据所消耗的时间明显短于以XML格式传输数据所消耗的时间,而略短于FSV传输数据消耗的时间。这是因为JSON生成文件的时候是利用JSON对象,使用Java String直接写入脚本,而XML则要生成一个doc对象[6],用输入输出流的方式写入XML文件。另外,无空属性JSON传输数据所消耗的时间小于无空属性JSON,无空属性XML传输数据所消耗的时间小于含空属性XML,这是因为当属性值为空时,省略掉格式的标签及符号,可以使传输负担减小,这样传输效率就相应提高了,传输时间也减短了。数据传输时间的比较再次证明JSON的数据传输效率优于其他数据传输格式。
在客户端,从服务器端传输过来JSON或XML的数据将被反序列化才能获取其中的数据,进而显示在客户端页面上。其中,XML是基于DOM树结构的,反序列化XML需要考虑父节点和子节点,这为反序列化增加了难度。如下是一个典型的XML格式表示:
而JSON只需要通过JavaScript语言的eval()函数就可以将JSON数据反序列化为JavaScript对象。如下是上述XML示例对应的JSON格式:
反序列化JSON通常采用如下方法:
实验通过一个简单的测试程序分别对JSON或XML格式数据反序列化时间进行了比较分析,进而比较了两种格式读取数据时的反序列化效率。为消除偶然误差,重复测验10次,数据反序列化效率分析如图5所示。
从图5中可以看出,JSON反序列化时间明显小于XML反序列化时间,这是与JSON和XML本身特殊的结构分不开的。采用JSON格式的数据大大降低了反序列化时的冗余度,使开发效率提高。若与AJAX技术相结合则会使即时页面更新效果更加显著,更好地提高用户体验。
图5 XML和JSON数据反序列化效率分析
本文提出了JSON数据传输开销计算公式。经过对JSON、XML及FSV这3种比较常用的数据传输格式的开销、传输时间以及客户端数据反序列化效率的量化比较,发现JSON的数据传输效率明显优于其他数据传输格式,这为Web开发者对数据传输格式的选择提供了更有力的参考。同时JSON便于阅读和编码,又是JavaScript规范的子集,便于机器解析,减少了解析XML带来的性能和兼容性问题,因此,对于需考虑流量和网络传输效率的环境以及轻量级的应用中,JSON应成为首选的数据传输格式。比如在移动应用开发中使用JSON结合AJAX的模式可以很好的解决移动设备带宽受限及网络流量要求较高的问题。
然而本文还有进一步需要提高的地方,针对数据传输的具体应用JSON的数据传输效率是否会一直优于其他数据传输格式,这是值得讨论的。因此,有必要针对具体的开发环境更为详细地讨论JSON等数据传输格式的优缺点,这也正是我们后续工作的内容。
[1]Ramon Lawrence.The space efficiency of XML[J].Information and Software Technology,2004,46(4):753-759.
[2]Ali Mesbah,Arie van Deursen.A component-and push-based architectural style for AJAX applications[J].The Journal of Systems and Software,2008,81(12):2194-2209.
[3]张涛,黄强,毛磊雅,等.一个基于JSON的对象序列化算法[J].计算机工程与应用,2007,43(15):98-100.
[4]丁波,晁爱农.基于Struts2框架的AJAX开发研究[J].计算机工程与设计,2009,30(16):3910-3917.
[5]黄强,王薇,张晓梅,等.基于JSON和IoC的AJAX-RMI插件[J].计算机工程,2009,35(19):71-74.
[6]崔璨,倪宏.使用JSON对AJAX技术中的XML性能的优化仿真[J].通信技术,2009,42(8):108-114.
[7]王沛,谢俊元.基于总线模型和Json的AJAX安全开发模型[J].计算机工程与设计,2008,29(3):586-589.
[8]胡文发,白中英.基于J2EE/J2ME的JSON数据交换的探讨[J].电子设计工程,2009,17(12):102-103.
[9]谭力,杨宗源,谢瑾奎.AJAX技术的数据响应优化[J].计算机工程,2010,36(7):52-54.