JSON和XML:不可同日而語

OneAPM官方技術部落格發表於2016-01-21

【編者按】本文作者 Yegor Bugayenko 是 Teamed.io 公司的聯合創始人,在軟體質量和工程管理方法領域有深入的研究。本文中,作者通過對比 JSON ,向大家更詳細地闡述了 XML 的四大特性,幫助大家在搭建專案時選擇適合的資料格式型別。

很多人都在心裡糾結,如果 JSON 和 XML 相比,誰更好誰更快?在接下來的新專案中到底選擇哪一個?別傻了!完全沒有可比性。就像自行車和 AMG S65 ,你能說哪個更好嗎?雖然兩者都是交通工具,但有些情況下,自行車反而更便捷。所以 JSON 和 XML 也一樣,它們都各有所長,完全沒有必要進行比較。

下面舉一個簡單的 JSON 資料(140個字元):

{
"id": 123,
"title": "Object Thinking",
"author": "David West",
"published": {
"by": "Microsoft Press",
"year": 2004
}
}

同樣的資料在 XML 中會表示如下(167個字元):

<?xml version="1.0"?>
<book id="123">
<title>Object Thinking</title>
<author>David West</author>
<published>
<by>Microsoft Press</by>
<year>2004</year>
</published>
</book>

很容易看出其中的區別,前者更簡潔更容易理解,而且能在JavaScript 中能完美解析。所以,我們便可以簡單粗暴地放棄 XML 選擇 JSON 了嗎?誰還會需要已歷時15年的重量級語言呢?

但恰恰相反,本人就非常喜愛 XML ,且聽下文分解。

但千萬別誤會,本文並不是在反對 JSON 。 JSON 的確是很好的資料格式,但它僅僅只是一種資料格式,經常被臨時用於將資料從 A 點傳到 B 點。它比 XML 更簡短易讀,但僅此而已。

XML 是一種非常強大的語言,而非只是單純的資料格式。相對於 JSON 和其他簡單的資料格式來說,如 YAML ,XML 至少有以下四個重要特性。

  • XPath

為了從文件中得到上文類似的出版年份,只需要傳送一個簡單的 XPath 請求:/book/published/year/text() 。但是,必須得有一個 XPath 處理器來解析請求並返回2004。好就好在 XPath2.0是集 functions、predicates、axes 等為一體的強大檢索引擎,在不用 Java 程式碼編寫任何遍歷的邏輯的情況下,就可以在 XPath 請求中以自然語言形式加入任何邏輯,例如,你可以直接發出請求 “How many books were published by David West in 2004?” ,便能通過 XPath 得到答案。而這是 JSON 所不能做到的。

  • Attributes and Namespaces

可以將 metadata 加到 XML 資料中,正如上面的 id 屬性一樣。資料儲存在元素中,例如圖書作者的姓名,而 metadata(資料的資料)應該儲存為屬性,這會大大有利於組織和結構化資訊。最重要的是,元素和屬性都可以標記為屬於某個 namespaces ,當多個應用使用同一 XML 文件時,這種技術的優勢會非常明顯。

  • XML Schema

試想這樣的情況,當你在一臺機器上建立了 XML 文件,在其他電腦上做了數次修改,然後又傳到別的電腦上使用,所以必須確保文件結構沒有被中間操作所破壞。比如可能有人用 儲存出版日期,但別人又可能使用 ISO-8601 格式的 。為了避免這樣的結構混亂,我們可以建立一個說明文件 XML Schema ,和主文件一起進行儲存。在每次操作主文件之前,都需要通過 schema 檔案檢查其正確性,這是生產過程中的一種整合測試。 RelaxNG 也是類似的機制,但會簡單很多,如果覺得 XML Schema 太過複雜不妨嘗試用 RelaxNG。

  • XSL

事實上,可以不用任何 Java/Ruby 等程式碼就能完成 XML 文件的修改。簡單的說,你只需要建立一個 XSL transformation 文件並將其應用於原始 XML ,然後得到一個新的 XML 。 XSL 語言(純功能性語言)是專為分層資料操作設計的,它比 Java 或任何其他物件導向/過程的語言都更適合這一任務。藉助 XSL 可以將 XML 轉換為任何形式,包括純文字和 HTML 。很多人抱怨 XSL 太複雜,但其實沒那麼難, XSL 的核心功能其實很簡單,大家不妨一試。

以上所述並不是 XML 的全部特徵,但這四大特性的確用途非凡。它們不僅可以讓文件的“自給自足”,還能進行自我驗證(XML Schema),進而知道如何修改(XSL),最後還能方便地獲得其中的文件內容(Xpath)。

同時,市面上還有很多以 XML 為基礎發展的語言、標準和應用,包括 Xforms、 SVG、 MathML、 RDF、 OWL、 WSDL 等。但一般的主流專案中都不會用到,因為它們的針對性都太強。

設計 JSON 的用途並非是滿足以上特性,儘管 JSON 領域現在努力嘗試,包括用於查詢的 JSONPath 、一些轉換工具和用於驗證的 json-schema ,但和強大的 XML 相比這只是微不足道的模仿,筆者並不認為會有長遠發展,而且遲早會消失殆盡。

綜上所述, JSON 是一種沒有過多附加功能的簡單資料格式,其最佳的使用情況是在 AJAX 下,除此之外,本人都強烈推薦大家使用 XML。

(編譯自:https://dzone.com/articles/stop-comparing-json-and-xml

OneAPM 為您提供端到端的 Java 應用效能解決方案,我們支援所有常見的 Java 框架及應用伺服器,助您快速發現系統瓶頸,定位異常根本原因。分鐘級部署,即刻體驗,Java 監控從來沒有如此簡單。想閱讀更多技術文章,請訪問 OneAPM 官方技術部落格

本文轉自 OneAPM 官方部落格

相關文章