目前,在web開發領域,主要的數據交換格式有XML和JSON,對於XML相信每一個web developer都不會感到陌生;相比之下,JSON可能對於一些新步入開發領域的新手會感到有些陌生,也可能你之前已經聽說過,但對於XML和 JSON的不同之處可能會不怎麼了解。對於在 Ajax開發中,是選擇XML還是JSON,一直存在着爭議,個人還是比較傾向於JSON的,雖然JSON才處於起步階段,但我相信JSON最終會取代XML成爲Ajax的首選,到時Ajax可能要更名爲Ajaj(Asynchronous JavaScript and JSON)了;
1.數據交換格式比較之關於XML和JSON:
XML:extensible markup language,一種類似於HTML的語言,他沒有預先定義的標籤,使用DTD(document type definition)文檔類型定義來組織數據;格式統一,跨平臺和語言,早已成爲業界公認的標準。具體的可以問Google或百度。相比之JSON這種輕量級的數據交換格式,XML可以稱爲重量級的了。
JSON : JavaScript Object Notation 是一種輕量級的數據交換格式。易於人閱讀和編寫。同時也易於機器解析和生成。它基於JavaScript Programming Language , Standard ECMA-262 3rd Edition - December 1999 的一個子集。 JSON採用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成爲理想的數據交換語言。
2.數據交換格式比較之關於輕量級和重量級:
輕量級和重量級是相對來說的,那麼XML相對於JSON的重量級體現在哪呢?我想應該體現在解析上,XML目前設計了兩種解析方式:DOM和SAX;
DOM是把一個數據交換格式XML看成一個DOM對象,需要把XML文件整個讀入內存,這一點上JSON和XML的原理是一樣的,但是XML要考慮父節點和子節點,這一點上JSON的解析難度要小很多,因爲JSON構建於兩種結構:key/value,鍵值對的集合;值的有序集合,可理解爲數組;
SAX不需要整個讀入文檔就可以對解析出的內容進行處理,是一種逐步解析的方法。程序也可以隨時終止解析。這樣,一個大的文檔就可以逐步的、一點一點的展現出來,所以SAX適合於大規模的解析。這一點,JSON目前是做不到得。
所以,JSON和XML的輕/重量級的區別在於:JSON只提供整體解析方案,而這種方法只在解析較少的數據時才能起到良好的效果;而XML提供了對大規模數據的逐步解析方案,這種方案很適合於對大量數據的處理。
3.數據交換格式比較之關於數據格式編碼及解析的難度:
在編碼上,雖然XML和JSON都有各自的編碼工具,但是JSON的編碼要比XML簡單,即使不借助工具,也可以寫出JSON代碼,但要寫出好的XML代碼就有點困難;與XML一樣,JSON也是基於文本的,且它們都使用Unicode編碼,且其與數據交換格式XML一樣具有可讀性。
主觀上來看,JSON更爲清晰且冗餘更少些。JSON網站提供了對JSON語法的嚴格描述,只是描述較簡短。從總體來看,XML比較適合於標記文檔,而JSON卻更適於進行數據交換處理。
在解析上,在普通的web應用領域,開發者經常爲XML的解析傷腦筋,無論是服務器端生成或處理XML,還是客戶端用 JavaScript 解析XML,都常常導致複雜的代碼,極低的開發效率。
實際上,對於大多數web應用來說,他們根本不需要複雜的XML來傳輸數據,XML宣稱的擴展性在此就很少具有優勢;許多Ajax應用甚至直接返回HTML片段來構建動態web頁面。和返回XML並解析它相比,返回HTML片段大大降低了系統的複雜性,但同時缺少了一定的靈活性。同XML或HTML片段相比,數據交換格式JSON 提供了更好的簡單性和靈活性。在web serivice應用中,至少就目前來說XML仍有不可動搖的地位。
JSON(Javascript Object Notation) 是一種輕量級的數據交換格式。易於人閱讀和編寫。同時也易於機器解析和生成。它基於Javascript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。JSON採用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C, C++, C#, Java, Javascript, Perl, Python等)。這些特性使JSON成爲理想的數據交換語言。
JSON概念很簡單,就是服務器直接生成Javascript語句,客戶端獲取後直接用eval方法來獲得這個對象,這樣就可以省去解析XML的性損失。
例如:
使用XML表示:
<items>
<item>
<id>1</id>
<author>asp</author>
<url>http://www.aspxuexi.com</url>
<content>Welcome to aspxuexi.com</content>
</item>
<item>
<id>2</id>
<author>Relkn</author>
<url>http://www.aspxuexi.com</url>
<content>aspxuexi.com 關注asp</content>
</item>
<item>
<id>3</id>
<author>kak</author>
<url>http://www.aspxuexi.com</url>
<content>www.aspxuexi.com asp教程</content>
</item>
</items>
<items>
<item>
<id>1</id>
<author>aspxuexi</author>
<url>http://www.aspxuexi.com</url>
<content>Welcome to aspxuexi.com</content>
</item>
<item>
<id>2</id>
<author>Relkn</author>
<url>http://www.aspxuexi.com</url>
<content>aspxuexi.com關注互聯網新技術</content>
</item>
<item>
<id>3</id>
<author>Kvogend</author>
<url>http://www.aspxuexi.com</url>
<content>aspxuexi.com關注WEB2.0</content>
</item>
</items>
使用JSON:
{items:[
{
id:1,
author:\"aspxuexi\",
url:\"http://www.aspxuexi.com\",
content:\"Welcome to aspxuexi.com\"
},
{
id:2,
author:\"Relkn\",
url:\"http://www.aspxuexi.com\",
content:\"aspxuexi.com關注互聯網新技術\"
},
{
id:3,
author:\"Kvogend\",
url:\"http://www.aspxuexi.com\",
content:\"aspxuexi.com關注WEB2.0\"
}
]};
{items:[
{
id:1,
author:\"aspxuexi\",
url:\"http://www.aspxuexi.com\",
content:\"Welcome to aspxuexi.com\"
},
{
id:2,
author:\"Relkn\",
url:\"http://www.aspxuexi.com\",
content:\"aspxuexi.com關注互聯網新技術\"
},
{
id:3,
author:\"Kvogend\",
url:\"http://www.aspxuexi.com\",
content:\"aspxuexi.com關注WEB2.0\"
}
]};
JSON不僅減少了解析XML解析帶來的性能問題和兼容性問題,而且對於Javascript來說非常容易使用,可以方便的通過遍歷數組以及訪問對象屬性來獲取數據,其可讀性也不錯,基本具備了結構化數據的性質。不得不說是一個很好的辦法,而且事實上google maps就沒有采用XML傳遞數據,而是採用了JSON方案。
JSON的另外一個優勢是"跨域性",例如你在www.aspxuexi.com的網頁裏使用
<script type="text/javascript" src="http://www.yyy.com/some.js">
是完全可行的,這就意味着你可以跨域傳遞信息。而使用XMLHttpRequest卻獲取不了跨域的信息,這是Javascript內部的安全性質所限制的。
JSON能完全取代XML嗎?當然不能,原因就在於XML的優勢:通用性。要使服務器端產生語法合格的Javascript代碼並不是很容易做到的,這主要發生在比較龐大的系統,服務器端和客戶端有不同的開發人員。它們必須協商對象的格式,這很容易造成錯誤。
Ajax:擁抱JSON,讓XML走開
Ajax(Asynchronous Javascript and XML)說到底就是一種瀏覽器異步讀取服務器上XML內容的技術。現在的技術凡是跟XML扯上關係,再加上個概念做幌子,就像金裝了一樣,拽得不行。門外的人看得很是熱鬧,門裏的人搖搖頭不外如是。XML呢,跨平臺的新潮語言?其實XML=TXT。XML只是符合很多規範的文本。它本身什麼都不是,只是保存字符的文件。而瀏覽器異步讀取的只是服務器上的文本內容,所以在Ajax開發時完全不必拘泥於XML。
JSON的來歷
XML 的作用是格式化數據內容。如果我們不用XML還有什麼更好的方法嗎?這個答案是JSON。介紹JSON之前我先介紹一下Javascript這門腳本語言。腳本語言自身有動態執行的天賦。即我們可以把想要執行的語句放在字符串裏,通過eval_r()這個動態執行函數來執行。字符串裏的內容會像我們寫的腳本一樣被執行。
JSON的格式
JSON的基本格式如下,
·對象是屬性、值對的集合。一個對象的開始於"{",結束於"}"。每一個屬性名和值間用":"提示,屬性間用","分隔。
·數組是有順序的值的集合。一個數組開始於"[",結束於"]",值之間用","分隔。
·值可以是引號裏的字符串、數字、true、false、null,也可以是對象或數組。這些結構都能嵌套。
·字符串的定義和C或Java基本一致。
·數字的定義也和C或Java基本一致。
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)了。
相對XML,JSON的解析速度提高了30%,佔用空間少30%。這些結果似乎和多數開發社區對兩種格式的看法一樣。換用JSON處理數據在性能上可以有不小的提升,而且還會減少空間的佔用。