前言
本文翻譯https://www.csestack.org/yaml-vs-json-vs-xml-difference/,下文會針對當前現有的資料序列化語言做下梳理。重點突出YAML是什麼,優缺點,和YML/JSON對比,以便於大家依據自己場景選擇合適的語言。
YAMML 簡介
YAML和JSON、XML一樣是資料序列化語言,使用縮排來描述格式化資料。
下面的例子可以看到其如何工作的:
就像Python一樣有個縮排約束,假如有過python開發體驗的話,就會很明顯的發現其使用縮排的數量來定義不同的區塊。正如前面提到,有很多如JSON、XML這樣被廣泛使用的序列化語言。
YAML使用場景
對於序列化語言來說,使用場景如下:
- 與伺服器之間傳輸資料
- 使用一個配置檔案來配置應用,這些檔案宣告對應引數和相應取值
- 在同一個應用不同元件之間轉換資料
- 中間資料儲存
針對此類場景,YAML有一些明確的優勢相比於其他同類語言。也是為什麼現在越來越多的開發者使用其的地方。
YAML的優勢
- YAML中沒有額外的定界符,所以相比JSON或者XML更輕量級。
- 沒有額外定界符,所以更易讀(這裡持原作者和譯者都持保留觀點,不少開發者認為有定界符的可讀性更強。)
- YAML使資料更易於理解,因此常用於配置檔案中(觀點同上)
- 應用比價哦廣泛,除配置檔案之外,傳輸資料和中間儲存都有實踐。
- YAML是JSON 的超集,對於合法的JSON程式碼,同樣可以被YAML解析,這樣對於使用JSON和YAML的應用來說,可以使用一個解析器完成兩種解析。
然而其並沒有如期望中那樣受歡迎,具體而言,因為不同的序列化語言都有其特定的適宜語言或者場景(下文可以提到),並且YAML有一些不足相較於其他廣泛使用的序列化語言。
YAML的不足
- 相對年輕,早期很多應用已經使用JONS或者XML來構建,對於開發者來說遷移至YAML成本是十分高的。
舉例,假如我們負責的專案是使用XML的,就算我們開發獨立的外掛也會傾向於XML以便更加契合。 - 流行廣泛程度反向作用域生態系統,例如XML 有著比YAML極為成熟的生態。JSON從2000年開始出現,同樣被高度採用。因此在YAML上可以找到對JSON的支援(譯者注:既有向現實妥協的味道,也是聰明的做法)
- YAML中有很多方式來體系化資料層級,因此處理時會相對複雜些。效能上相對於XML和JSON會有差別。
- 可能一些開發人員發現很難使用其複雜的縮排格式。
三種概述
YAML,XML和JSON是常用的資料序列化語言,下面會針對三者之間的不同展開敘述。原作者針對如何選擇適合自己專案的資料序列化語言給出了部分建議,以供參考。
三者直觀對比
- YAM 是 'YAML Aint Markup Language'(YAML不是一種標記語言?)的縮寫,本意在強調其以資料作為重心,而非標記語言。
- JSON 比較直白 “JavaScript Object Notation“( JS 物件標記),一種輕量級的資料交換格式,與js天然契合。
- XML 是 “eXtensible Markup Language”(可擴充套件標記語言),這裡再看YML,其強調自己不是標記語言。
- XML和HTML相同,使用標籤來定義資料結構
- YAML使用縮排來定義結構化資料,因此每個YAML中的資料塊通過空白的數量來區分
- 三者檔案的副檔名都與其名稱對應, .yaml for YAML, .json for JSON, .xml for XML,比較容易記憶。
- 實際上,三者的副檔名都是比較隨意的,對開發者和應用來說重要的是其檔案格式,內容型別和資料結構。(譯者按,重要的是內容,例如.yml和.yaml幾乎無差別。.js的檔案中依然可以儲存json).
示例
yaml
YAML的例子中,比較個性的就是每個資料塊都有相對應的空白格。
這裡就直接照搬原文示例了:
json
xml
三者在應用中的不同表現
現在時候,大家發現三者的不同取決於在何種應用中使用。
- 當提到javascript的時候,JSON是最適合的序列化語言
- 對於java開發者來說,張嘴閉嘴就是xml
- Python和YAML有相同的空格贖金,所以對於Pythoner們來說,YAML是更友好的選擇
從上面可以看出,使用哪一種序列化語言,取決於你在使用什麼技術棧。
如何選擇序列化語言
資料以良好的資料結構儲存在不同序列化語言中,無論使用哪一種,都要包含以下四種主要的活動:
- 將內容從序列化語言中解析
- 讀取所需的值
- 操作對應值
- 很可能,還得將操作之後的值塞回到序列化語言中去
要實現以上幾種開發行為,你必須要可以解析的程式碼,幸運的是,市面上已經有很多開源支援常見語言(像c,c++,java等)的工具包或者庫來解析序列化之後的資料。
為什麼不應該花費時間來開發解析器
首先自己開發可能存在一些問題,使用優秀的開源包來避免該問題,當然還節約時間。
因此在使用某一種序列化語言之前,首先應該查詢解析器,閱讀文件, 選擇合適自己專案的序列化語言。對於自己來說,簡單的呼叫方法就能解決的事情當然要比自己手動實現要好。
反其道而行之
雖然都說Python與YMAL更搭,但是原作者在Python專案中卻選擇了JSON。對此其理由如下:
原作者負責的是符合Redfish標準的,使用REST API和bottle 框架(一個Python框架),核心語言是Python的一個專案。同樣面臨著需要在伺服器和客戶端轉換資料的場景,選中JSON作為序列化語言,業界早已存在Python語言開發的轉義包。導致這個選擇的重要原因是,Python的字典和所以的序列化語言一樣不過是使用name-value儲存資料的程式碼,仔細檢視會發現JSON 的map是格式更接近Python的字典。
結束語
到這裡,三種序列化語言異同的介紹就結束了,希望能有所幫助。對於資料序列化語言來說,每一種都是關於資料表示格式,但從功能來說,並沒有優劣之分,每一種都有其適合的場景。更重要的是,開發人員對理解和解析序列化語言的舒適度才是重要的。更多文章請移步我的部落格
感謝
再次感謝原作者的兩篇文章
- Advantages and Disadvantages of YAML over XML and JSON
- YAML vs JSON vs XML | What is the Difference Between Them?