Nomad & His Life

博观而约取,厚积而薄发
posts - 15, comments - 88, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Ajax:拥抱JSON,让XML走开

Posted on 2006-10-01 10:39 Nomad 阅读(6739) 评论(33)  编辑  收藏 所属分类: Ajax
版权所有,转载请注明,来自www.jialing.net

Ajax(Asynchronous JavaScript and XML)说到底就是一种浏览器异步读取服务器上XML内容的技术。现在的技术凡是跟XML扯上关系,再加上个概念做幌子,就像金装了一样,拽得不行。门外的人看得很是热闹,门里的人摇摇头不外如是。XML呢,跨平台的新潮语言?其实XML=TXT。XML只是符合很多规范的文本。它本身什么都不是,只是保存字符的文件。而浏览器异步读取的只是服务器上的文本内容,所以在Ajax开发时完全不必拘泥于XML。[版权所有,www.jialing.net]


  • JSON的来历

XML的作用是格式化数据内容。如果我们不用XML还有什么更好的方法吗?这个答案是JSON。介绍JSON之前我先介绍一下JavaScript这门脚本语言。脚本语言自身有动态执行的天赋。即我们可以把想要执行的语句放在字符串里,通过eval()这个动态执行函数来执行。字符串里的内容会像我们写的脚本一样被执行。
示例1:
<HTML>
<HEAD>
<TITLE>eval example 1</TITLE>
</HEAD>
<BODY>
<script>
str 
= "alert('hello')";
eval(str);
</script>
</BODY>
</HTML>

打开页面会弹出hello窗口。
我们可以在字符串中放任何脚本语句,包括声明语句:
<HTML>
<HEAD>
<TITLE>eval example 2</TITLE>
</HEAD>
<BODY>
<script>
define 
= "{name:'Michael',email:'17bity@gmail.com'}";
eval(
"data = "+define);
alert(
"name:"+data.name);
alert(
"email:"+data.email);
</script>
</BODY>
</HTML>

如果我们在后台异步传来的文本是JavaScript的声明语句,那么不是一条eval方法就能解析了?对于解析复杂的XML,这样的效率是多么大的提高啊!
现在就来告诉你什么是JSON:JavaScript Object Notation。我更愿意把它翻译为JavaScript对象声明。比如要从后台载入一些通讯录的信息,如果写成XML,如下:

<contact>
    
<friend>
        
<name>Michael</name>
        
<email>17bity@gmail.com</email>
        
<homepage>http://www.jialing.net</homepage>
    
</friend>
    
<friend>
        
<name>John</name>
        
<email>john@gmail.com</email>
        
<homepage>http://www.john.com</homepage>
    
</friend>
    
<friend>
        
<name>Peggy</name>
        
<email>peggy@gmail.com</email>
        
<homepage>http://www.peggy.com</homepage>
    
</friend>
</contact>


而写成JSON呢:
[
 {
   name:
"Michael",
   email:
"17bity@gmail.com",
   homepage:
"http://www.jialing.net"
 },
 {
   name:
"John",
   email:
"john@gmail.com",
   homepage:
"http://www.jobn.com"
 },
 {
   name:
"Peggy",
   email:
"peggy@gmail.com",
   homepage:
"http://www.peggy.com"
 }
]



简单的不只是表达上,最重要的是可以丢弃让人晕头转向的DOM解析了。因为只要符合JavaScript的声明规范,JavaScrip会自动帮你解析好的。Ajax中使用JSON的基本方法是前台载入后台声明JavaScript对象的字符串,用eval方法来将它转为实际的对象,最后通过DHTML更新页面信息。

  • JSON的格式

JSON的基本格式如下,图片来自json.org:
对象是属性、值对的集合。一个对象的开始于"{",结束于"}"。每一个属性名和值间用":"提示,属性间用","分隔。
object.gif


数组是有顺序的值的集合。一个数组开始于"[",结束于"]",值之间用","分隔。
array.gif


值可以是引号里的字符串、数字、true、false、null,也可以是对象或数组。这些结构都能嵌套。
value.gif


字符串的定义和C或Java基本一致。
string.gif


数字的定义也和C或Java基本一致。
number.gif


  • JSON VS XML

可读性
JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,很难分出胜负。

可扩展性

XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。

编码难度
XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。

解码难度
XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。

流行度

XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous JavaScript and JSON)了。

[版权所有,www.jialing.net]


附:
JSON.org : http://www.json.org/
JSON in JavaScript : http://www.json.org/js.html
JSON: The Fat-Free Alternative to XML : http://www.json.org/xml.html
JSON and the Dynamic Script Tag: Easy, XML-less Web Services for JavaScript: http://www.xml.com/pub/a/2005/12/21/json-dynamic-script-tag.html
Using JSON (JavaScript Object Notation) with Yahoo! Web Services: http://developer.yahoo.com/common/json.html

评论

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-10-01 11:09 by 慈悲鱼
不错啊.XML的解析与修改,让人比较烦

收藏,下次http返回就不用xml格式了,直接返回JSON格式.
用js,运行一下.

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-10-01 11:20 by 慈悲鱼
<script>
//数组
arr="[1,2,3]";
eval("data = "+define);
eval("test1 = "+arr);
alert("test1:"+test1[1]);
</script>

一个数组的例子

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-10-01 12:25 by 江南白衣
不错,json.org有提供什么函数可以像XML里xstream那样,直接binding java对象吗?

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-10-01 13:14 by Nomad
@江南白衣
当然有了,参见http://json-lib.sourceforge.net
http://json-lib.sourceforge.net/usage.html

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-10-01 15:35 by jeffjie
http://json-lib.sourceforge.net 上面的包相对完备,不过依赖挺多的第三记包.
上一个项目里我直接用Json.org上面提供的Java文件来打了一个小包,轻便得多.

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-10-01 18:07 by mixlee
xml对tree结构的处理还有优势的,其他数据结构用JSON最好

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-10-01 18:57 by 江南白衣
http://json-lib.sourceforge.net/usage.html 看起来很不错。

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-10-01 20:13 by JonneyQuest
很好,可以弥补AJAX的一些缺点。

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-10-02 09:49 by Zhang
全用javascript会不会太慢?象msn spaces那样。

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-10-02 10:10 by Nomad
@Zhang
我想JSON的速度肯定比解析XML快很多。

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-10-03 23:02 by emu
>>现在的技术凡是跟XML扯上关系,再加上个概念做幌子,就像金装了一样,拽得不行。
xml早过了幼稚期了,楼主在讲的是多少年前的历史?

>>门外的人看得很是热闹,门里的人摇摇头不外如是。
不知道楼主在门里站了多久了?xml的优点都了解了吗?

>>XML的作用是格式化数据内容。如果我们不用XML还有什么更好的方法吗?这个答案是JSON。
在某些情形下xml适合的数据包装方法不等于就是“更好的方法”,json也不会总是惟一的“答案”。完全可以想像在某些更特殊的情形下,有比xml和json更适合的包装方法。


>>JSON VS XML

>>可读性
>>JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,很难分出胜负。
还算公道

>>可扩展性
>>XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。
不知道楼主对扩展性有什么理解?xml灵活到可以描述自身,json能整个json schema出来吗?

>>编码难度
>>XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。
这就有失公允和混淆概念了。
若是光论不借助工具要‘写出’xml或者json,xml很可能比json更不容易犯错。比如上面楼主写错的json例子,如果用xml写估计就不会出错。
不过“比如Dom4j、JDom等,JSON也有json.org提供的工具”这写主要都是解析json和xml的工具,而不只是“写”json和xml的工具。真正的不借助工具解析json也是不行的,我们在javascript的运行环境里面不需要借助其他工具,是因为我们借助javascript解析引擎在做这个工作。

>>解码难度
>>XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。
这就颠倒黑白了。xml的解析和json一样都需要考虑子节点父节点,因为都是一样的依赖于树状的数据结构,不能用json描述了一个简单数据而用xml描述一个复杂的树状数据来胡乱比较吧。

>>流行度
>>XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous JavaScript and JSON)了。

不知道何以见得未来一定是xml让位于json呢?

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-10-03 23:24 by Nomad
@emu
emu兄说的确实有道理,小弟先学习了。
有时候我们喜欢一门技术,就像女朋友一样,在我们眼里她是最好的。我说那么多根本的目的就是希望有更多的人了解JSON,使用JSON,最后喜欢上JSON。我这边夸得正起劲,emu兄来个当头棒喝,真是让我不知道怎么说下去。总之,各有各的喜好,各有各的观点,我想我是不需要争辩的。

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-10-04 11:43 by emu
一边说有道理,一边删了我一个回复……
和你一样,我也喜欢json。热爱技术的人才接受不了别人在阐述自己热爱的技术的时候漏洞百出,让不了解的人以为这个技术如此而已。
注意到你的修改了,不过我认为你的修改还是不对,这回不是语法问题了,而是和上面给出的xml没有充分对照关系。而且json数据本身也失去了充分的自说明性,从{
name:"Michael",
email:"17bity@gmail.com",
homepage:"http://www.jialing.net"">http://www.jialing.net"
}中如何可以看出这是一个friend的数据而不是一个学生或者客户的数据呢?这样你的json数据在和上面的xml相比的时候未免输了半筹。其实昨天的friend属性名是必要的,只是你没有写对而已。

其实做一个讨论技术的回复并不比写一篇灌水的blog轻松。我一向认为一个认真严谨的回复是对作者辛勤码字的尊重,而看到自己的作品被人无故删除,不论是blog还是comment,都让人感觉不那么舒服。

<BODY>
<xml id="xmldata">
<contact>
<friend>
<name>Michael</name>
<email>17bity@gmail.com</email>
<homepage>http://www.jialing.net</homepage>
</friend>
<friend>
<name>John</name>
<email>john@gmail.com</email>
<homepage>http://www.john.com</homepage>
</friend>
<friend>
<name>Peggy</name>
<email>peggy@gmail.com</email>
<homepage>http://www.peggy.com</homepage>
</friend>
</contact>
</xml>
<SCRIPT LANGUAGE="JavaScript">
<!--
var jsondata = {contact:{friend:[
{
name:"Michael",
email:"17bity@gmail.com",
homepage:"http://www.jialing.net"">http://www.jialing.net"
},
{
name:"John",
email:"john@gmail.com",
homepage:"http://www.jobn.com"
},
{
name:"Peggy",
email:"peggy@gmail.com",
homepage:"http://www.peggy.com"
}
]}}
alert(xmldata.selectSingleNode("contact/friend[2]/name").text)
alert(jsondata.contact.friend[2].name)
//-->
</SCRIPT>
</BODY>

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-10-04 11:46 by emu
这个blog有个地方讨厌的很,贴回复的时候出现 http:// 字样就会自动多出些东西来……
homepage:"http://www.jialing.net"">http://www.jialing.net"
应该是 homepage:"http://www.jialing.net"

博观而约取,厚积而薄发,楼主的座右铭不错。

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-10-04 18:36 by 冰川
Ajax(Asynchronous JavaScript and XML)说到底就是一种浏览器异步读取服务器上XML内容的技术。现在的技术凡是跟XML扯上关系,再加上个概念做幌子,就像金装了一样,拽得不行----------楼主的这段话我还是同意
门外的人看得很是热闹,门里的人摇摇头不外如是---这句话我看着就不太舒服
因为,我一个三年工作经验的人也成了门外汉了。。。

XML即可扩展标记语言(eXtensible Markup Language)。标记是指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,既可以选择国际通用的标记语言,比如HTML,也可以使用象XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML是从SGML中简化修改出来的。它主要用到的有XML、XSL和XPath等。

它是一种得到业界广泛支持的语言,参与开发它的世界软件巨头有:IBM、Microsoft、SUN、Oracle、BEA、Tibco、IONA 。。。等等

它对于互连网数据传输的贡献是无可比拟的,它也定义了目前相当完美的数据格式规范。

而这篇文章中提到的JSON只是一种方便界面开发的一种技术,它的使用范围只限定于方便某项功能的实现,连跟XML比的资格都没有啊,如果你拿Java和XML比对于业界的贡献谁大,那我都没意见(我会说Java的贡献要更大一点)。

如果这篇帖子是BLOG的主人的原创的话,请你想一下JSON格式的数据能方便在网络上进行数据交换吗?JSON格式的数据能序列化和反序列话吗?

如果这篇帖子是BLOG的主人的原创的话,请确定对技术很熟悉了才能去比较它们,不然是会误导别人的。


# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-10-04 18:58 by 冰川
请注意XML是一种规范,它包括很多技术的。
刚看了BLOG主人给emu的回帖,我还是能理解的。
我上面的回帖只对帖子,不是对人的啊~~~
还好这篇贴字是放在BLOGJAVA上,要是放在XML技术论坛上的话。。。
哈哈,好了,还是支持主人贡献技术文章!!!

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-10-04 19:22 by 冰川
@Nomad
最后,我的经验表明,速度快的Web表示层不要用JavaScript。

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-10-05 00:09 by Nomad
@冰川
很高兴,今天上来又看到有人拍砖了。
我这篇文章从题目到结尾,都讲的是在Ajax这个“小”领域里,前后台之间的交互,JSON相对于XML有不可比拟的优势,我并没有说以后在哪都不需要XML了。我的话可能是有些偏激,但请大家理解我的初衷。

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-10-06 08:44 by 郭大侠
原文写得太好了,虽然稍微有点倾向。看来以后的项目可以作为一种参考。

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-10-07 12:15 by emu
>>我这篇文章从题目到结尾,都讲的是在Ajax这个“小”领域里,前后台之间的交互,JSON相对于XML有不可比拟的优势,我并没有说以后在哪都不需要XML了。

真的如此吗?

>>现在的技术凡是跟XML扯上关系,再加上个概念做幌子,就像金装了一样,拽得不行。门外的人看得很是热闹,门里的人摇摇头不外如是。

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-10-14 11:04 by 坎井之蛙
反对:“JSON相对于XML有不可比拟的优势”,支持:楼主的精神!
博观而约取,厚积而薄发!像你致敬! 呵呵!写文章有时候真的是件很累的事情哦!

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-10-15 16:38 by swallor
几楼的朋友?说json与xml比不能序列化?XML最大的特点是结构化的文档定义,xml文件可以很简单,如楼主的例子,也可以是复杂,如果你了解schemal ,就会认为XML是一种真正的语言,而json很“轻”。什么在网络上数据交换,序列化反序列化,又不是XML的专利,实现JSON序列化有什么不能的吗?人家已经提供了 http://cfopen.org/projects/json-serializer/%20

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-11-20 16:36 by SeamanWang
如楼主例子中的xml的复杂程度,我也可以写一个“通用”的js解析函数,将xml解析成js对象;
而且在编码问题上,我认为都是通过程序来编码,很少需要人工编码;
在这两方面,JSON不见得比XML有多大优势。
不知道楼主怎么看。

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-11-20 17:39 by Nomad
@SeamanWang
如果用通用的XML解析函数,效率问题就值得探讨了,再加上怎么通用,不同的实现可能有不同的标准,学习和使用可能会多一道坎。

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2006-12-16 19:15 by 1212122

111

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2007-01-25 09:25 by abba
json确实是好东西
xml整洁而且信息量多

有个千秋,但是追求效率还是json
意见完毕

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2007-04-03 11:14 by nebulayao
更加坚定了我用json作为后台传给ajax数据的决心,好文

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2007-04-12 22:40 by Tong Jie
JSON格式的数据能序列化和反序列话吗?

你理解序列化的意思吗?当然可以,否则怎么作为数据交互的容器?

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2007-09-06 19:48 by 不在偏激
没用过JSON 有点熟悉XML lz说XML=TXT倒不如说的更彻底些:XML就是一系列0、1组成的数列,这样什么Oracle,java ,windows也没啥可牛的。

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2008-05-08 19:54 by star
两人争得很激烈...我正在看JSON..找个自己需要的东西.不评论谁好谁坏.

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2008-05-22 09:23 by 蓝鲸
我刚刚在AJAX里用了JSON,个人感觉是这样的,如果数据量不多,用JSON还是比较方便的,但如果比较多,就不如用XML了,用XML在编码的时候感觉思路更清晰一些,可能是习惯了XML吧.

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2008-09-27 10:43 by qianwt
感觉用JSON的好处就是, 对于跨浏览器方面方便些,毕竟服务器返回的JSON串,到JavaScript里就直接可以用了,好像创建XML对象要麻烦些, 也不知道说的对不对

# re: Ajax:拥抱JSON,让XML走开  回复  更多评论   

2009-06-03 12:19 by 等待花儿都谢了
2009年6月了.
不知道如今的两者关系有没有变化.

只有注册用户登录后才能发表评论。


网站导航: