配置文件選型——爲何要用YAML?

開宗明義: YAML是個好格式!程序員

做爲配置文件,YAML應該是對人眼讀取和編輯最友好的了,固然擴展性呢,就比JSON差了點,更不如XML,不過有舍有得麼,通常狀況下夠用了。服務器

優勢

直接上例子,看一下對比效果就知道了。測試

JSON

同一組配置,用JSON寫是這個樣子:code

{
  "id": 100,
  "name": "測試項目",
  "version": "3.1",
  "steps": [
    {
      "id": 18,
      "action": "Prepare",
      "expects": [
        {
          "id": 238,
          "result": "GOOD"
        },
        {
          "id": 239,
          "result": "PERFECT"
        }
      ]
    }
  ]
}

雖然格式化之後可讀性也不錯,但編輯起來就費勁了。這還僅僅是三層嵌套,括號對齊就有點嚇人。xml

XML

若是用XML表示,會更加複雜,像下面這段,在沒有語法高亮的狀況下,讀起來對人是一種折磨:對象

<?xml version="1.0" encoding="utf-8" ?>
<project>
    <id datatype="int">100</id>: 100
    <name datatype="string">測試項目</name>
    <version datatype="string">3.1</version>
    <steps>
        <step>
            <id datatype="int">18</id>,
            <action datatype="string">Prepare</action>,
            <expects>
                <step>
                    <id datatype="int">238</id>
                    <result datatype="ResultType">GOOD</result>
                </step>
                <step>
                    <id datatype="int">239</id>
                    <result datatype="ResultType">PERFECT</result>
                </step>
            </expects>
        </step>
    </steps>
</project>

要想手敲這段代碼,更是容易出錯:各類標籤不封閉,嵌套層級混亂之類的。(想象一下遠程登陸到服務器,用VIM或Nano打開它的樣子)。utf-8

YAML

當YAML到來之後,世界一會兒清爽了:文檔

id: 100
name: "測試項目"
version: "3.1"
steps:
  - id: 18
    action: "Prepare"
    expects:
      - id: 238,
        result: GOOD
      - id: 239,
        result: PERFECT

是否是無比簡潔? 僅僅字符數,JSON就比YAML多了75%,XML更是多出320%!究其緣由,主要是YAML直接使用了對人眼友好的return和tab做爲數據分隔符,這樣一來,編輯起來簡直跟Markdown文檔差很少,堪稱程序員福利啊。string

缺點

固然這世上沒有銀彈,YAML也有它固有的缺點。io

  • 首先開頭提到過,它的擴展性差——這一點上XML優點明顯,它每一個標籤有attribute,能夠任意定義「元數據」,好比示例中的datatype,這是YAML和JSON的共同弱項;若是實在須要,就只能把元數據也放在數據項中,而後用特殊的字符前綴來標識(相似Python對象中的__dict__)
  • 其次它對格式要求很嚴格,無法以「緊湊」形式表達:好比不須要人讀的時候,咱們能夠把JSON串壓縮在一行,儘量去除全部空格,這個YAML顯然作不到。
  • 還有就是各類語言中,對YAML的支持都還不夠成熟,尤爲是序列化/反序列化部分,現有的庫都很不方便。

結論

若是沒有強烈的第三方擴展性需求,YAML是配置文件的最佳選項。固然,爲此付出的代價,就是一開始須要手寫一點點序列化/反序列化代碼。

相關文章
相關標籤/搜索