Linux中國

XML 與 JSON 優劣對比

簡介

XMLJSON 是現今互聯網中最常用的兩種數據交換格式。XML 格式由 W3C 於 1996 年提出。JSON 格式由 Douglas Crockford 於 2002 年提出。雖然這兩種格式的設計目標並不相同,但它們常常用於同一個任務,也就是數據交換中。XML 和 JSON 的文檔都很完善(RFC 7159RFC 4825),且都同時具有 人類可讀性 human-readable 機器可讀性 machine-readable 。這兩種格式並沒有哪一個比另一個更強,只是各自適用的領域不用。(LCTT 譯註:W3C 是互聯網聯盟,制定了各種 Web 相關的標準,如 HTML、CSS 等。Douglas Crockford 除了制定了 JSON 格式,還致力於改進 JavaScript,開發了 JavaScript 相關工具 JSLintJSMin

XML 的優點

XML 與 JSON 相比有很多優點。二者間最大的不同在於 XML 可以通過在標籤中添加屬性這一簡單的方法來存儲 元數據 metadata 。而使用 JSON 時需要創建一個對象,把元數據當作對象的成員來存儲。雖然二者都能達到存儲元數據的目的,但在這一情況下 XML 往往是更好的選擇,因為 JSON 的表達形式會讓客戶端程序開發人員誤以為要將數據轉換成一個對象。舉個例子,如果你的 C++ 程序需要使用 JSON 格式發送一個附帶元數據的整型數據,需要創建一個對象,用對象中的一個 名稱/值對 name/value pair 來記錄整型數據的值,再為每一個附帶的屬性添加一個名稱/值對。接收到這個 JSON 的程序在讀取後很可能把它當成一個對象,可事實並不是這樣。雖然這是使用 JSON 傳遞元數據的一種變通方法,但他違背了 JSON 的核心理念:「 JSON 的結構與常規的程序語言中的結構相對應,而無需修改。 JSON』s structures look like conventional programming language structures. No restructuring is necessary. 1

雖然稍後我會說這也是 XML 的一個缺點,但 XML 中對命名衝突、 前綴 prefix 的處理機制賦予了它 JSON 所不具備的能力。程序員們可以通過前綴來把統一名稱給予兩個不同的實體。 2 當不同的實體在客戶端中使用的名稱相同時,這一特性會非常有用。

XML 的另一個優勢在於大多數的瀏覽器可以把它以 具有高可讀性和強組織性的方式 highly readable and organized way 展現給用戶。XML 的樹形結構讓它易於結構化,瀏覽器也讓用戶可以自行展開或摺疊樹中的元素,這簡直就是調試的福音。

XML 對比 JSON 有一個很重要的優勢就是它可以記錄 混合內容 mixed content 。例如在 XML 中處理包含結構化標記的字元串時,程序員們只要把帶有標記的文本放在一個標籤內就可以了。可因為 JSON 只包含數據,沒有用於指明標籤的簡單方式,雖然可以使用處理元數據的解決方法,但這總有點濫用之嫌。

JSON 的優點

JSON 自身也有很多優點。其中最顯而易見的一點就是 JSON 比 XML 簡潔得多。因為 XML 中需要打開和關閉標籤,而 JSON 使用名稱/值對表示數據,使用簡單的 {} 來標記對象,[] 來標記數組,, 來表示數據的分隔,: 表示名稱和值的分隔。就算是使用 gzip 壓縮,JSON 還是比 XML 要小,而且耗時更少。 3 正如 Sumaray 和 Makki 在實驗中指出的那樣,JSON 在很多方面都比 XML 更具優勢,得出同樣結果的還有 Nurseitov、Paulson、Reynolds 和 Izurieta。首先,由於 JSON 文件天生的簡潔性,與包含相同信息的 XML 相比,JSON 總是更小,這意味著更快的傳輸和處理速度。第二,在不考慮大小的情況下,兩組研究 4 5 表明使用 JSON 執行序列化和反序列化的速度顯著優於使用 XML。第三,後續的研究指出 JSON 的處理在 CPU 資源的使用上也優於 XML。研究人員發現 JSON 在總體上使用的資源更少,其中更多的 CPU 資源消耗在用戶空間,系統空間消耗的 CPU 資源較少。這一實驗是在 RedHat 的設備上進行的,RedHat 表示更傾向於在用戶空間使用 CPU 資源。 6 不出意外,Sumaray 和 Makki 在研究里還說明了在移動設備上 JSON 的性能也優於 XML。 7 這是有道理的,因為 JSON 消耗的資源更少,而移動設備的性能也更弱。

JSON 的另一個優點在於其對對象和數組的表述和 宿主語言 host language 中的數據結構相對應,例如 對象 object 記錄 record 結構體 struct 字典 dictionary 哈希表 hash table 鍵值列表 keyed list 還有 數組 array 向量 vector 列表 list ,以及對象組成的數組等等。 8 雖然 XML 里也能表達這些數據結構,也只需調用一個函數就能完成解析,而往往需要更多的代碼才能正確的完成 XML 的序列化和反序列化處理。而且 XML 對於人類來說不如 JSON 那麼直觀,XML 標準缺乏對象、數組的標籤的明確定義。當結構化的標記可以替代嵌套的標籤時,JSON 的優勢極為突出。JSON 中的花括弧和中括弧則明確表示了數據的結構,當然這一優勢也包含前文中的問題,在表示元數據時 JSON 不如 XML 準確。

雖然 XML 支持 命名空間 namespace 前綴 prefix ,但這不代表 JSON 沒有處理命名衝突的能力。比起 XML 的前綴,它處理命名衝突的方式更簡潔,在程序中的處理也更自然。在 JSON 里,每一個對象都在它自己的命名空間中,因此不同對象內的元素名稱可以隨意重複。在大多數編程語言中,不同的對象中的成員可以包含相同的名字,所以 JSON 根據對象進行名稱區分的規則在處理時更加自然。

也許 JSON 比 XML 更優的部分是因為 JSON 是 JavaScript 的子集,所以在 JavaScript 代碼中對它的解析或封裝都非常的自然。雖然這看起來對 JavaScript 程序非常有用,而其他程序則不能直接從中獲益,可實際上這一問題已經被很好的解決了。現在 JSON 的網站的列表上展示了 64 種不同語言的 175 個工具,它們都實現了處理 JSON 所需的功能。雖然我不能評價大多數工具的質量,但它們的存在明確了開發者社區擁抱 JSON 這一現象,而且它們切實簡化了在不同平台使用 JSON 的難度。

二者的動機

簡單地說,XML 的目標是標記文檔。這和 JSON 的目標想去甚遠,所以只要用得到 XML 的地方就儘管用。它使用樹形的結構和包含語義的文本來表達混合內容以實現這一目標。在 XML 中可以表示數據的結構,但這並不是它的長處。

JSON 的目標是用於數據交換的一種結構化表示。它直接使用對象、數組、數字、字元串、布爾值這些元素來達成這一目標。這完全不同於文檔標記語言。正如上面說的那樣,JSON 沒有原生支持 混合內容 mixed content 的記錄。

軟體

這些主流的開放 API 僅提供 XML: 亞馬遜產品廣告 API Amazon Product Advertising API

這些主流 API 僅提供 JSON: 臉書圖 API Facebook Graph API 谷歌地圖 API Google Maps API 推特 API Twitter API 、AccuWeather API、Pinterest API、Reddit API、Foursquare API。

這些主流 API 同時提供 XML 和 JSON: 谷歌雲存儲 Google Cloud Storage 領英 API Linkedin API 、Flickr API。

根據 可編程網路 Programmable Web 9 的數據,最流行的 10 個 API 中只有一個是僅提供 XML 且不支持 JSON 的。其他的要麼同時支持 XML 和 JSON,要麼只支持 JSON。這表明了大多數應用開發者都更傾向於使用支持 JSON 的 API,原因大概是 JSON 更快的處理速度與良好口碑,加之與 XML 相比更加輕量。此外,大多數 API 只是傳遞數據而非文檔,所以 JSON 更加合適。例如 Facebook 的重點在於用戶的交流與帖子,谷歌地圖則主要處理坐標和地圖信息,AccuWeather 就只傳遞天氣數據。總之,雖然不能說天氣 API 在使用時究竟是 JSON 用的多還是 XML 用的多,但是趨勢明確偏向了 JSON。 10 11

這些主流的桌面軟體仍然只是用 XML:Microsoft Word、Apache OpenOffice、LibraOffice。

因為這些軟體需要考慮引用、格式、存儲等等,所以比起 JSON,XML 優勢更大。另外,這三款程序都支持混合內容,而 JSON 在這一點上做得並不如 XML 好。舉例說明,當用戶使用 Microsoft Word 編輯一篇論文時,用戶需要使用不同的文字字形、文字大小、文字顏色、頁邊距、段落格式等,而 XML 結構化的組織形式與標籤屬性生來就是為了表達這些信息的。

這些主流的資料庫支持 XML:IBM DB2、Microsoft SQL Server、Oracle Database、PostgresSQL、BaseX、eXistDB、MarkLogic、MySQL。

這些是支持 JSON 的主流資料庫:MongoDB、CouchDB、eXistDB、Elastisearch、BaseX、MarkLogic、OrientDB、Oracle Database、PostgreSQL、Riak。

在很長一段時間裡,SQL 和關係型資料庫統治著整個資料庫市場。像 甲骨文 Oracle 微軟 Microsoft 這樣的軟體巨頭都提供這類資料庫,然而近幾年 NoSQL 資料庫正逐步受到開發者的青睞。也許是正巧碰上了 JSON 的普及,大多數 NoSQL 資料庫都支持 JSON,像 MongoDB、CouchDB 和 Riak 這樣的資料庫甚至使用 JSON 來存儲數據。這些資料庫有兩個重要的特性是它們適用於現代網站:一是它們與關係型資料庫相比 更容易擴展 more scalable ;二是它們設計的目標就是 web 運行所需的核心組件。 12 由於 JSON 更加輕量,又是 JavaScript 的子集,所以很適合 NoSQL 資料庫,並且讓這兩個品質更容易實現。此外,許多舊的關係型資料庫增加了 JSON 支持,例如 Oracle Database 和 PostgreSQL。由於 XML 與 JSON 間的轉換比較麻煩,所以大多數開發者會直接在他們的應用里使用 JSON,因此開發資料庫的公司才有支持 JSON 的理由。(LCTT 譯註:NoSQL 是對不同於傳統的關係資料庫的資料庫管理系統的統稱。參考來源 13

未來

對互聯網的種種變革中,最讓人期待的便是 物聯網 Internet of Things (IoT)。這會給互聯網帶來大量計算機之外的設備,例如手錶、溫度計、電視、冰箱等等。這一勢頭的發展良好,預期在不久的將來迎來爆髮式的增長。據估計,到 2020 年時會有 260 億 到 2000 億的物聯網設備被接入互聯網。 14 15 幾乎所有的物聯網設備都是小型設備,因此性能比筆記本或台式電腦要弱很多,而且大多數都是嵌入式系統。因此,當它們需要與互聯網上的系統交換數據時,更輕量、更快速的 JSON 自然比 XML 更受青睞。 16 受益於 JSON 在 web 上的快速普及,與 XML 相比,這些新的物聯網設備更有可能從使用 JSON 中受益。這是一個典型的梅特卡夫定律的例子,無論是 XML 還是 JSON,抑或是什麼其他全新的格式,現存的設備和新的設備都會從支持最廣泛使用的格式中受益。

Node.js 是一款伺服器端的 JavaScript 框架,隨著她的誕生與快速成長,與 MongoDB 等 NoSQL 資料庫一起,讓全棧使用 JavaScript 開發成為可能。這些都預示著 JSON 光明的未來,這些軟體的出現讓 JSON 運用在全棧開發的每一個環節成為可能,這將使應用更加輕量,響應更快。這也是任何應用的追求之一,所以,全棧使用 JavaScript 的趨勢在不久的未來都不會消退。 17

此外,另一個應用開發的趨勢是從 SOAP 轉向 REST。 18 19 20 XML 和 JSON 都可以用於 REST,可 SOAP 只能使用 XML。

從這些趨勢中可以推斷,JSON 的發展將統一 Web 的信息交換格式,XML 的使用率將繼續降低。雖然不應該把 JSON 吹過頭了,因為 XML 在 Web 中的使用依舊很廣,而且它還是 SOAP 的唯一選擇,可考慮到 SOAP 到 REST 的遷移,NoSQL 資料庫和全棧 JavaScript 的興起,JSON 卓越的性能,我相信 JSON 很快就會在 Web 開發中超過 XML。至於其他領域,XML 比 JSON 更好的情況並不多。

角注

  1. Introducing JSON
  2. XML Tutorial
  3. JSON vs. XML: Some hard numbers about verbosity
  4. Comparison of JSON and XML Data Interchange Formats: A Case Study
  5. A comparison of data serialization formats for optimal efficiency on a mobile platform
  6. Comparison of JSON and XML Data Interchange Formats: A Case Study
  7. A comparison of data serialization formats for optimal efficiency on a mobile platform
  8. Introducing JSON
  9. Most Popular APIs: At Least One Will Surprise You
  10. Why JSON will continue to push XML out of the picture
  11. Thousands of APIs Paint a Bright Future for the Web
  12. Why JSON will continue to push XML out of the picture
  13. How JSON sparked NoSQL – and will return to the RDBMS fold
  14. A Simple Explanation Of 『The Internet Of Things』
  15. Proofpoint Uncovers Internet of Things (IoT) Cyberattack
  16. Why JSON will continue to push XML out of the picture
  17. Why JSON will continue to push XML out of the picture
  18. Thousands of APIs Paint a Bright Future for the Web
  19. 3,000 Web APIs: Trends From A Quickly Growing Directory
  20. How REST replaced SOAP on the Web: What it means to you

via: https://www.cs.tufts.edu/comp/150IDS/final_papers/tstras01.1/FinalReport/FinalReport.html

作者:TOM STRASSNER 選題:lujun9972 譯者:wwhio 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國