YAML & JSON &XML如何選擇


前言

本文翻譯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的字典。

結束語

到這里,三種序列化語言異同的介紹就結束了,希望能有所幫助。對於數據序列化語言來說,每一種都是關於數據表示格式,但從功能來說,並沒有優劣之分,每一種都有其適合的場景。更重要的是,開發人員對理解和解析序列化語言的舒適度才是重要的。更多文章請移步我的博客

感謝

再次感謝原作者的兩篇文章

參考文章


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM