XML與JSON優(yōu)劣對比
簡介
XML 和 JSON 是現(xiàn)今互聯(lián)網(wǎng)中最常用的兩種數(shù)據(jù)交換格式。XML 格式由 W3C 于 1996 年提出。JSON 格式由 Douglas Crockford 于 2002 年提出。雖然這兩種格式的設(shè)計目標(biāo)并不相同,但它們常常用于同一個任務(wù),也就是數(shù)據(jù)交換中。XML 和 JSON 的文檔都很完善(RFC 7159[1]、RFC 4825[2]),且都同時具有人類可讀性human-readable和機器可讀性machine-readable。這兩種格式并沒有哪一個比另一個更強,只是各自適用的領(lǐng)域不用。(LCTT 譯注:W3C 是互聯(lián)網(wǎng)聯(lián)盟[3],制定了各種 Web 相關(guān)的標(biāo)準(zhǔn),如 HTML、CSS 等。Douglas Crockford 除了制定了 JSON 格式,還致力于改進 JavaScript,開發(fā)了 JavaScript 相關(guān)工具 JSLint[4] 和 JSMin[5])
XML 的優(yōu)點
XML 與 JSON 相比有很多優(yōu)點。二者間最大的不同在于 XML 可以通過在標(biāo)簽中添加屬性這一簡單的方法來存儲元數(shù)據(jù)metadata。而使用 JSON 時需要創(chuàng)建一個對象,把元數(shù)據(jù)當(dāng)作對象的成員來存儲。雖然二者都能達到存儲元數(shù)據(jù)的目的,但在這一情況下 XML 往往是更好的選擇,因為 JSON 的表達形式會讓客戶端程序開發(fā)人員誤以為要將數(shù)據(jù)轉(zhuǎn)換成一個對象。舉個例子,如果你的 C++ 程序需要使用 JSON 格式發(fā)送一個附帶元數(shù)據(jù)的整型數(shù)據(jù),需要創(chuàng)建一個對象,用對象中的一個名稱/值對name/value pair來記錄整型數(shù)據(jù)的值,再為每一個附帶的屬性添加一個名稱/值對。接收到這個 JSON 的程序在讀取后很可能把它當(dāng)成一個對象,可事實并不是這樣。雖然這是使用 JSON 傳遞元數(shù)據(jù)的一種變通方法,但他違背了 JSON 的核心理念:“JSON 的結(jié)構(gòu)與常規(guī)的程序語言中的結(jié)構(gòu)相對應(yīng),而無需修改。JSON’s structures look like conventional programming language structures. No restructuring is necessary.”1
雖然稍后我會說這也是 XML 的一個缺點,但 XML 中對命名沖突、前綴prefix的處理機制賦予了它 JSON 所不具備的能力。程序員們可以通過前綴來把統(tǒng)一名稱給予兩個不同的實體。2 當(dāng)不同的實體在客戶端中使用的名稱相同時,這一特性會非常有用。
XML 的另一個優(yōu)勢在于大多數(shù)的瀏覽器可以把它以具有高可讀性和強組織性的方式highly readable and organized way展現(xiàn)給用戶。XML 的樹形結(jié)構(gòu)讓它易于結(jié)構(gòu)化,瀏覽器也讓用戶可以自行展開或折疊樹中的元素,這簡直就是調(diào)試的福音。
XML 對比 JSON 有一個很重要的優(yōu)勢就是它可以記錄混合內(nèi)容mixed content。例如在 XML 中處理包含結(jié)構(gòu)化標(biāo)記的字符串時,程序員們只要把帶有標(biāo)記的文本放在一個標(biāo)簽內(nèi)就可以了。可因為 JSON 只包含數(shù)據(jù),沒有用于指明標(biāo)簽的簡單方式,雖然可以使用處理元數(shù)據(jù)的解決方法,但這總有點濫用之嫌。
JSON 的優(yōu)點
JSON 自身也有很多優(yōu)點。其中最顯而易見的一點就是 JSON 比 XML 簡潔得多。因為 XML 中需要打開和關(guān)閉標(biāo)簽,而 JSON 使用名稱/值對表示數(shù)據(jù),使用簡單的 { 和 } 來標(biāo)記對象,[和 ] 來標(biāo)記數(shù)組,, 來表示數(shù)據(jù)的分隔,: 表示名稱和值的分隔。就算是使用 gzip 壓縮,JSON 還是比 XML 要小,而且耗時更少。3 正如 Sumaray 和 Makki 在實驗中指出的那樣,JSON 在很多方面都比 XML 更具優(yōu)勢,得出同樣結(jié)果的還有 Nurseitov、Paulson、Reynolds 和 Izurieta。首先,由于 JSON 文件天生的簡潔性,與包含相同信息的 XML 相比,JSON 總是更小,這意味著更快的傳輸和處理速度。第二,在不考慮大小的情況下,兩組研究 4 5 表明使用 JSON 執(zhí)行序列化和反序列化的速度顯著優(yōu)于使用 XML。第三,后續(xù)的研究指出 JSON 的處理在 CPU 資源的使用上也優(yōu)于 XML。研究人員發(fā)現(xiàn) JSON 在總體上使用的資源更少,其中更多的 CPU 資源消耗在用戶空間,系統(tǒng)空間消耗的 CPU 資源較少。這一實驗是在 RedHat 的設(shè)備上進行的,RedHat 表示更傾向于在用戶空間使用 CPU 資源。6 不出意外,Sumaray 和 Makki 在研究里還說明了在移動設(shè)備上 JSON 的性能也優(yōu)于 XML。7 這是有道理的,因為 JSON 消耗的資源更少,而移動設(shè)備的性能也更弱。
JSON 的另一個優(yōu)點在于其對對象和數(shù)組的表述和宿主語言host language中的數(shù)據(jù)結(jié)構(gòu)相對應(yīng),例如對象object、記錄record、結(jié)構(gòu)體struct、字典dictionary、哈希表hash table、鍵值列表keyed list還有數(shù)組array、向量vector、列表list,以及對象組成的數(shù)組等等。8 雖然 XML 里也能表達這些數(shù)據(jù)結(jié)構(gòu),也只需調(diào)用一個函數(shù)就能完成解析,而往往需要更多的代碼才能正確的完成 XML 的序列化和反序列化處理。而且 XML 對于人類來說不如 JSON 那么直觀,XML 標(biāo)準(zhǔn)缺乏對象、數(shù)組的標(biāo)簽的明確定義。當(dāng)結(jié)構(gòu)化的標(biāo)記可以替代嵌套的標(biāo)簽時,JSON 的優(yōu)勢極為突出。JSON 中的花括號和中括號則明確表示了數(shù)據(jù)的結(jié)構(gòu),當(dāng)然這一優(yōu)勢也包含前文中的問題,在表示元數(shù)據(jù)時 JSON 不如 XML 準(zhǔn)確。
雖然 XML 支持命名空間namespace與前綴prefix,但這不代表 JSON 沒有處理命名沖突的能力。比起 XML 的前綴,它處理命名沖突的方式更簡潔,在程序中的處理也更自然。在 JSON 里,每一個對象都在它自己的命名空間中,因此不同對象內(nèi)的元素名稱可以隨意重復(fù)。在大多數(shù)編程語言中,不同的對象中的成員可以包含相同的名字,所以 JSON 根據(jù)對象進行名稱區(qū)分的規(guī)則在處理時更加自然。
也許 JSON 比 XML 更優(yōu)的部分是因為 JSON 是 JavaScript 的子集,所以在 JavaScript 代碼中對它的解析或封裝都非常的自然。雖然這看起來對 JavaScript 程序非常有用,而其他程序則不能直接從中獲益,可實際上這一問題已經(jīng)被很好的解決了?,F(xiàn)在 JSON 的網(wǎng)站的列表上展示了 64 種不同語言的 175 個工具,它們都實現(xiàn)了處理 JSON 所需的功能。雖然我不能評價大多數(shù)工具的質(zhì)量,但它們的存在明確了開發(fā)者社區(qū)擁抱 JSON 這一現(xiàn)象,而且它們切實簡化了在不同平臺使用 JSON 的難度。
二者的動機
簡單地說,XML 的目標(biāo)是標(biāo)記文檔。這和 JSON 的目標(biāo)想去甚遠,所以只要用得到 XML 的地方就盡管用。它使用樹形的結(jié)構(gòu)和包含語義的文本來表達混合內(nèi)容以實現(xiàn)這一目標(biāo)。在 XML 中可以表示數(shù)據(jù)的結(jié)構(gòu),但這并不是它的長處。
JSON 的目標(biāo)是用于數(shù)據(jù)交換的一種結(jié)構(gòu)化表示。它直接使用對象、數(shù)組、數(shù)字、字符串、布爾值這些元素來達成這一目標(biāo)。這完全不同于文檔標(biāo)記語言。正如上面說的那樣,JSON 沒有原生支持混合內(nèi)容mixed content的記錄。
軟件
這些主流的開放 API 僅提供 XML:亞馬遜產(chǎn)品廣告 APIAmazon Product Advertising API。
這些主流 API 僅提供 JSON:臉書圖 APIFacebook Graph API、谷歌地圖 APIGoogle Maps API、推特 APITwitter API、AccuWeather API、Pinterest API、Reddit API、Foursquare API。
這些主流 API 同時提供 XML 和 JSON:谷歌云存儲Google Cloud Storage、領(lǐng)英 APILinkedin API、Flickr API。
根據(jù)可編程網(wǎng)絡(luò)Programmable Web 9 的數(shù)據(jù),最流行的 10 個 API 中只有一個是僅提供 XML 且不支持 JSON 的。其他的要么同時支持 XML 和 JSON,要么只支持 JSON。這表明了大多數(shù)應(yīng)用開發(fā)者都更傾向于使用支持 JSON 的 API,原因大概是 JSON 更快的處理速度與良好口碑,加之與 XML 相比更加輕量。此外,大多數(shù) API 只是傳遞數(shù)據(jù)而非文檔,所以 JSON 更加合適。例如 Facebook 的重點在于用戶的交流與帖子,谷歌地圖則主要處理坐標(biāo)和地圖信息,AccuWeather 就只傳遞天氣數(shù)據(jù)??傊m然不能說天氣 API 在使用時究竟是 JSON 用的多還是 XML 用的多,但是趨勢明確偏向了 JSON。10 11
這些主流的桌面軟件仍然只是用 XML:Microsoft Word、Apache OpenOffice、LibraOffice。
因為這些軟件需要考慮引用、格式、存儲等等,所以比起 JSON,XML 優(yōu)勢更大。另外,這三款程序都支持混合內(nèi)容,而 JSON 在這一點上做得并不如 XML 好。舉例說明,當(dāng)用戶使用 Microsoft Word 編輯一篇論文時,用戶需要使用不同的文字字形、文字大小、文字顏色、頁邊距、段落格式等,而 XML 結(jié)構(gòu)化的組織形式與標(biāo)簽屬性生來就是為了表達這些信息的。
這些主流的數(shù)據(jù)庫支持 XML:IBM DB2、Microsoft SQL Server、Oracle Database、PostgresSQL、BaseX、eXistDB、MarkLogic、MySQL。
這些是支持 JSON 的主流數(shù)據(jù)庫:MongoDB、CouchDB、eXistDB、Elastisearch、BaseX、MarkLogic、OrientDB、Oracle Database、PostgreSQL、Riak。
在很長一段時間里,SQL 和關(guān)系型數(shù)據(jù)庫統(tǒng)治著整個數(shù)據(jù)庫市場。像甲骨文Oracle和微軟Microsoft這樣的軟件巨頭都提供這類數(shù)據(jù)庫,然而近幾年 NoSQL 數(shù)據(jù)庫正逐步受到開發(fā)者的青睞。也許是正巧碰上了 JSON 的普及,大多數(shù) NoSQL 數(shù)據(jù)庫都支持 JSON,像 MongoDB、CouchDB 和 Riak 這樣的數(shù)據(jù)庫甚至使用 JSON 來存儲數(shù)據(jù)。這些數(shù)據(jù)庫有兩個重要的特性是它們適用于現(xiàn)代網(wǎng)站:一是它們與關(guān)系型數(shù)據(jù)庫相比更容易擴展more scalable;二是它們設(shè)計的目標(biāo)就是 web 運行所需的核心組件。12 由于 JSON 更加輕量,又是 JavaScript 的子集,所以很適合 NoSQL 數(shù)據(jù)庫,并且讓這兩個品質(zhì)更容易實現(xiàn)。此外,許多舊的關(guān)系型數(shù)據(jù)庫增加了 JSON 支持,例如 Oracle Database 和 PostgreSQL。由于 XML 與 JSON 間的轉(zhuǎn)換比較麻煩,所以大多數(shù)開發(fā)者會直接在他們的應(yīng)用里使用 JSON,因此開發(fā)數(shù)據(jù)庫的公司才有支持 JSON 的理由。(LCTT 譯注:NoSQL 是對不同于傳統(tǒng)的關(guān)系數(shù)據(jù)庫的數(shù)據(jù)庫管理系統(tǒng)的統(tǒng)稱。參考來源[6]) 13
未來
對互聯(lián)網(wǎng)的種種變革中,最讓人期待的便是物聯(lián)網(wǎng)Internet of Things(IoT)。這會給互聯(lián)網(wǎng)帶來大量計算機之外的設(shè)備,例如手表、溫度計、電視、冰箱等等。這一勢頭的發(fā)展良好,預(yù)期在不久的將來迎來爆發(fā)式的增長。據(jù)估計,到 2020 年時會有 260 億 到 2000 億的物聯(lián)網(wǎng)設(shè)備被接入互聯(lián)網(wǎng)。14 15 幾乎所有的物聯(lián)網(wǎng)設(shè)備都是小型設(shè)備,因此性能比筆記本或臺式電腦要弱很多,而且大多數(shù)都是嵌入式系統(tǒng)。因此,當(dāng)它們需要與互聯(lián)網(wǎng)上的系統(tǒng)交換數(shù)據(jù)時,更輕量、更快速的 JSON 自然比 XML 更受青睞。16 受益于 JSON 在 web 上的快速普及,與 XML 相比,這些新的物聯(lián)網(wǎng)設(shè)備更有可能從使用 JSON 中受益。這是一個典型的梅特卡夫定律的例子,無論是 XML 還是 JSON,抑或是什么其他全新的格式,現(xiàn)存的設(shè)備和新的設(shè)備都會從支持最廣泛使用的格式中受益。
Node.js 是一款服務(wù)器端的 JavaScript 框架,隨著她的誕生與快速成長,與 MongoDB 等 NoSQL 數(shù)據(jù)庫一起,讓全棧使用 JavaScript 開發(fā)成為可能。這些都預(yù)示著 JSON 光明的未來,這些軟件的出現(xiàn)讓 JSON 運用在全棧開發(fā)的每一個環(huán)節(jié)成為可能,這將使應(yīng)用更加輕量,響應(yīng)更快。這也是任何應(yīng)用的追求之一,所以,全棧使用 JavaScript 的趨勢在不久的未來都不會消退。17
此外,另一個應(yīng)用開發(fā)的趨勢是從 SOAP 轉(zhuǎn)向 REST。18 19 20 XML 和 JSON 都可以用于 REST,可 SOAP 只能使用 XML。
從這些趨勢中可以推斷,JSON 的發(fā)展將統(tǒng)一 Web 的信息交換格式,XML 的使用率將繼續(xù)降低。雖然不應(yīng)該把 JSON 吹過頭了,因為 XML 在 Web 中的使用依舊很廣,而且它還是 SOAP 的唯一選擇,可考慮到 SOAP 到 REST 的遷移,NoSQL 數(shù)據(jù)庫和全棧 JavaScript 的興起,JSON 卓越的性能,我相信 JSON 很快就會在 Web 開發(fā)中超過 XML。至于其他領(lǐng)域,XML 比 JSON 更好的情況并不多。
角注
1. Introducing JSON[7]
2. XML Tutorial[8]
3. JSON vs. XML: Some hard numbers about verbosity[9]
4. Comparison of JSON and XML Data Interchange Formats: A Case Study[10]
5. A comparison of data serialization formats for optimal efficiency on a mobile platform[11]
6. Comparison of JSON and XML Data Interchange Formats: A Case Study[10]
7. A comparison of data serialization formats for optimal efficiency on a mobile platform[11]
8. Introducing JSON[7]
9. Most Popular APIs: At Least One Will Surprise You[12]
10. Why JSON will continue to push XML out of the picture[13]
11. Thousands of APIs Paint a Bright Future for the Web[14]
12. Why JSON will continue to push XML out of the picture[13]
13. How JSON sparked NoSQL – and will return to the RDBMS fold[15]
14. A Simple Explanation Of ‘The Internet Of Things’[16]
15. Proofpoint Uncovers Internet of Things (IoT) Cyberattack[17]
16. Why JSON will continue to push XML out of the picture[13]
17. Why JSON will continue to push XML out of the picture[13]
18. Thousands of APIs Paint a Bright Future for the Web[14]
19. 3,000 Web APIs: Trends From A Quickly Growing Directory[18]
20. How REST replaced SOAP on the Web: What it means to you[19]