跟小D每日学口语
随笔 - 12  文章 - 0 评论 - 43 trackbacks - 2
<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

与我联系

搜索

 

常用链接

留言簿

我参加的小组

我参与的团队

我的标签

随笔分类(3)

随笔档案(12)

最新评论

阅读排行榜

评论排行榜

原创文章,如需转载,请注明出处。

当我们在定义AJAX服务的时候,对于各种各样的请求,应该以什么样的数据格式来响应哪?
当然如果是请求一段Markup代码的话,HTML就是最合适的,客户端请求到数据后,就可以直接插入到前端页面中了。那如果客户端需要的是纯粹的数据的话,我们是应该提供XML哪,还是JSON?这两者各有什么优缺点和好处哪,了解了这两者的差异后我们就可以基于实际情况进行权衡取舍了。

我们从以下几个方面来进行比较:
1、客户端
在客户端通过向服务器发送XMLHttpRequest,就可以得到请求数据了,哪什么样的数据格式更容易处理哪?
 
JSON示例:

    
"author" :  "Gambardella, Matthew"
    
"title"    :  "XML Developer's Guide"
    
"genre"  :  "Computer" 
}

对于JSON数据,只需要调用JavaScript的Eval方法就可以将JSON字符串序列化成为JavaScript对象,而后就可以直接访问了。如下所示:

var book = eval(request.responseText);  
alert(book.author);

XML示例:
<book>
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
</book>

对于XML数据,其本身是一个DOM Tree的数据结构,开发人员必须使用DOM API来访问和处理XML数据;而且DOM在各个浏览器中的实现也不尽相同,所以针对XML DOM的编程方式会变的更为复杂。参见下面的实现方式:

var book = request.responseXML;   
var authors = book.getElementsByTagName("author");  
alert(authors[
0].firstChild.textContent);

另外对于XMLDOM,浏览器目前还不支持类似于XPath这样的查询语句。显然对于XMLDOM数据的访问显然要比访问JSON复杂多了。

2、服务器端
在服务器端需要向客户端发送数据,什么样的数据格式处理起来更容易哪?

显然对于如何序列化或者犯序列化一个对象成为XML字符串,各种服务端的编程语言都有提供,而且还会有多种方式。例如.NET Framework就提供了XmlSerializer类来序列化一个对象成为Xml文档,另外开发人员还可以使用XmlWriter、XMLDocument来直接构建Xml字符串。

而对于JSON这样一种数据格式则鲜有提供,这就需要开发人员自己动手或者使用一些Open Source的Library。在复杂对象的序列化或者反序列化上,由于Xml做的比较早应该会更稳定一些。

在这点上XML会优于JSON.

3、安全性
JSON 本来是JavaScript 的一个安全的子集,不会含有赋值和调用。因此在将JSON数据装换成为JavaScript对象的时候,我们包括许多JavaScript 库都使用 Eval 函数。这意味着获取的JSON数据将被解析并执行,注意是执行,尤其有一些数据是来自用户输入的话,可能会带来意想不到的安全性问题。攻击者也可以利用这点发送畸形、恶意的 JSON数据,这样Eval 函数就会执行这些恶意代码。

从这一点上来说也要求我们如果在使用JSON作为数据交换格式的时候,必须保障JSON安全。比较常见的办法是使用正则表达式来检查JSON数据是否包含有恶意代码关键字。

而XML则相对来讲更安全一些。

4、性能
从数据传输量上来看JSON显然要优于XML,JSON更轻量级一些,它没有像XML那样多的Open和Closing标记。同时在对数据的解析速度上,JSON也要优于XML。

5. 其他
另外从数据格式的验证角度来看的话,XML的验证技术更成熟,而目前关于JSON的验证还比较少。

Tag标签: JSON,XML
posted on 2008-07-04 14:50 ted 阅读(1459) 评论(9)  编辑 收藏

FeedBack:
#1楼  2008-07-04 14:55 Bruce Liu      
不错,不错,特别是我们封装一些自定义的AJAX控件
  回复  引用  查看    
#2楼  2008-07-04 15:17 横刀天笑      
服务器端现在开源的JSON系列化组件都很成熟了,都可以自动的来搞定这块,而如果用原生的XML API来解析XML的话,那将是一个体力活,而且很容易出错,所以我觉得即使在服务器端JSON也优于XML

还有关于安全性,你用eval当然有这个问题,看都不看JSON里面的内容直接eval了,你可以使用那个json.js来“反系列化”JSON字符串安全性就强多了。
而且一般对我们来说需要用JSON或者XML来传输的东东并不是很复杂,所以不会存在多少问题。

即使就你所说的如果服务器端传回的是一段HTML片段,我也要质疑一下,服务器端为什么要返回HTML片段?如果不是遗留的问题,我觉得也不要传递HTML片段了,从服务器端传HTML片段回来,服务器端肯定有个“组装”HTML文档程序,这部分也是纯手工编码容易出错还不讨好。要是传输一个JSON字符串回来,然后客户端用js自动的将JSON字符串“反系列化”后“映射”到界面上

我在一个项目中完整的使用了JSON,整个过程基本上都是自动化进行的,没有之前XML那种getElementByXXX,也没有XXX.value = XXX等重复的语句了

写的比较多,也比较乱,本没有抨击使用XML传输的意思,毕竟XML还是个通用的标准,我觉得这个才是XML的优势。

我研究的不深,说了些自己看法。呵呵
  回复  引用  查看    
#3楼  2008-07-04 16:31 kevin_shan [未注册用户]
不错,顶
  回复  引用    
#4楼 [楼主] 2008-07-04 20:27 ted      
@横刀天笑
首先谢谢你的回复,本文就是要比较在AJAX应用中,JSON和XML作为数据交换格式的差异,以便于我们进行选择。

就服务器端JSON和XML的序列化以及反序列化来讲,XML的会更成熟,且选择的余地会很多。当然JSON也有对应的开源类库,但相对来讲比较少。当然了对于项目来讲只要有一种实现就够了,我们这里只是比较两者的不同,以及两者的优劣。

另外从安全性上来讲,JSON数据有可能会被注入一些恶意代码,我们需要处理更多的东西相对于XML。
  回复  引用  查看    
#5楼  2008-07-04 22:52 Loki& [未注册用户]
我公司一个项目中用到一个比较旧的控件,它只能用JavaScript在客户端操作,我在Load纯数据的时候使用的Ajax把结果集从数据库返回成DataTable,然后再Json数据发送到客户端,当数据达到2000行的时候基本上就搞死机了。
另外,Json后的数据集返回到客户端一般怎么去与控件数据绑定请教了?
  回复  引用    
#6楼 [楼主] 2008-07-04 23:44 ted      
@ninghuang22@163.com
第一个问题从你的描述来看应该是数据量的问题,建议能否分批次进行数据获取,按照客户端实际显示需求来确定数据加载行数。

第二个问题的一般做法是先在客户端定义HTML模板,并且定义绑定表达式。而后使用JavaScript操纵JSON来对模板进行数据绑定,最后更新HTML代码。
  回复  引用  查看    
如何保证安全性呢?

  回复  引用    
我们是这样做的:用ADO对象recordset做为数据载体,
我们封装成Active X,这样在客户端想如何就如何啊。
  回复  引用    
#9楼  2008-07-06 21:17 airwolf2026      
关注下
  回复  引用  查看    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-07-04 20:31 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: