Nomad & His Life

          博觀而約取,厚積而薄發(fā)
          posts - 15, comments - 88, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Ajax:擁抱JSON,讓XML走開

          Posted on 2006-10-01 10:39 Nomad 閱讀(6768) 評論(33)  編輯  收藏 所屬分類: Ajax
          版權所有,轉載請注明,來自www.jialing.net

          Ajax(Asynchronous JavaScript and XML)說到底就是一種瀏覽器異步讀取服務器上XML內容的技術。現在的技術凡是跟XML扯上關系,再加上個概念做幌子,就像金裝了一樣,拽得不行。門外的人看得很是熱鬧,門里的人搖搖頭不外如是。XML呢,跨平臺的新潮語言?其實XML=TXT。XML只是符合很多規(guī)范的文本。它本身什么都不是,只是保存字符的文件。而瀏覽器異步讀取的只是服務器上的文本內容,所以在Ajax開發(fā)時完全不必拘泥于XML。[版權所有,www.jialing.net]


          • JSON的來歷

          XML的作用是格式化數據內容。如果我們不用XML還有什么更好的方法嗎?這個答案是JSON。介紹JSON之前我先介紹一下JavaScript這門腳本語言。腳本語言自身有動態(tài)執(zhí)行的天賦。即我們可以把想要執(zhí)行的語句放在字符串里,通過eval()這個動態(tài)執(zhí)行函數來執(zhí)行。字符串里的內容會像我們寫的腳本一樣被執(zhí)行。
          示例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的聲明規(guī)范,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的可讀性可謂不相上下,一邊是建議的語法,一邊是規(guī)范的標簽形式,很難分出勝負。

          可擴展性

          XML天生有很好的擴展性,JSON當然也有,沒有什么是XML能擴展,JSON不能的。

          編碼難度
          XML有豐富的編碼工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的編碼明顯比XML容易許多,即使不借助工具也能寫出JSON的代碼,可是要寫好XML就不太容易了。

          解碼難度
          XML的解析得考慮子節(jié)點父節(jié)點,讓人頭昏眼花,而JSON的解析難度幾乎為0。這一點XML輸的真是沒話說。

          流行度

          XML已經被業(yè)界廣泛的使用,而JSON才剛剛開始,但是在Ajax這個特定的領域,未來的發(fā)展一定是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結構的處理還有優(yōu)勢的,其他數據結構用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的優(yōu)點都了解了嗎?

          >>XML的作用是格式化數據內容。如果我們不用XML還有什么更好的方法嗎?這個答案是JSON。
          在某些情形下xml適合的數據包裝方法不等于就是“更好的方法”,json也不會總是惟一的“答案”。完全可以想像在某些更特殊的情形下,有比xml和json更適合的包裝方法。


          >>JSON VS XML

          >>可讀性
          >>JSON和XML的可讀性可謂不相上下,一邊是建議的語法,一邊是規(guī)范的標簽形式,很難分出勝負。
          還算公道

          >>可擴展性
          >>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的運行環(huán)境里面不需要借助其他工具,是因為我們借助javascript解析引擎在做這個工作。

          >>解碼難度
          >>XML的解析得考慮子節(jié)點父節(jié)點,讓人頭昏眼花,而JSON的解析難度幾乎為0。這一點XML輸的真是沒話說。
          這就顛倒黑白了。xml的解析和json一樣都需要考慮子節(jié)點父節(jié)點,因為都是一樣的依賴于樹狀的數據結構,不能用json描述了一個簡單數據而用xml描述一個復雜的樹狀數據來胡亂比較吧。

          >>流行度
          >>XML已經被業(yè)界廣泛的使用,而JSON才剛剛開始,但是在Ajax這個特定的領域,未來的發(fā)展一定是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"
          }中如何可以看出這是一個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"
          },
          {
          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"

          博觀而約取,厚積而薄發(fā),樓主的座右銘不錯。

          # 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等。

          它是一種得到業(yè)界廣泛支持的語言,參與開發(fā)它的世界軟件巨頭有:IBM、Microsoft、SUN、Oracle、BEA、Tibco、IONA 。。。等等

          它對于互連網數據傳輸的貢獻是無可比擬的,它也定義了目前相當完美的數據格式規(guī)范。

          而這篇文章中提到的JSON只是一種方便界面開發(fā)的一種技術,它的使用范圍只限定于方便某項功能的實現,連跟XML比的資格都沒有啊,如果你拿Java和XML比對于業(yè)界的貢獻誰大,那我都沒意見(我會說Java的貢獻要更大一點)。

          如果這篇帖子是BLOG的主人的原創(chuàng)的話,請你想一下JSON格式的數據能方便在網絡上進行數據交換嗎?JSON格式的數據能序列化和反序列話嗎?

          如果這篇帖子是BLOG的主人的原創(chuàng)的話,請確定對技術很熟悉了才能去比較它們,不然是會誤導別人的。


          # re: Ajax:擁抱JSON,讓XML走開  回復  更多評論   

          2006-10-04 18:58 by 冰川
          請注意XML是一種規(guī)范,它包括很多技術的。
          剛看了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有不可比擬的優(yōu)勢,我并沒有說以后在哪都不需要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有不可比擬的優(yōu)勢,我并沒有說以后在哪都不需要XML了。

          真的如此嗎?

          >>現在的技術凡是跟XML扯上關系,再加上個概念做幌子,就像金裝了一樣,拽得不行。門外的人看得很是熱鬧,門里的人搖搖頭不外如是。

          # re: Ajax:擁抱JSON,讓XML走開  回復  更多評論   

          2006-10-14 11:04 by 坎井之蛙
          反對:“JSON相對于XML有不可比擬的優(yōu)勢”,支持:樓主的精神!
          博觀而約取,厚積而薄發(fā)!像你致敬! 呵呵!寫文章有時候真的是件很累的事情哦!

          # 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有多大優(yōu)勢。
          不知道樓主怎么看。

          # 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里就直接可以用了,好像創(chuàng)建XML對象要麻煩些, 也不知道說的對不對

          # re: Ajax:擁抱JSON,讓XML走開  回復  更多評論   

          2009-06-03 12:19 by 等待花兒都謝了
          2009年6月了.
          不知道如今的兩者關系有沒有變化.

          只有注冊用戶登錄后才能發(fā)表評論。


          網站導航:
           
          主站蜘蛛池模板: 孝昌县| 武平县| 宁城县| 镶黄旗| 富蕴县| 长垣县| 洛扎县| 楚雄市| 盈江县| 萨嘎县| 甘洛县| 新余市| 漯河市| 苏尼特右旗| 东山县| 漳浦县| 贞丰县| 抚远县| 平利县| 屏南县| 赤峰市| 乐陵市| 辛集市| 寻乌县| 清远市| 延安市| 泽州县| 泰来县| 潼南县| 双流县| 万山特区| 通城县| 黎平县| 长寿区| 德格县| 阳信县| 新宁县| 广德县| 大城县| 禄丰县| 仙游县|