1

开宗明义: YAML是个好格式!

作为配置文件,YAML应该是对人眼读取和编辑最友好的了,当然扩展性呢,就比JSON差了点,更不如XML,不过有舍有得么,一般情况下够用了。

优点

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

JSON

同一组配置,用JSON写是这个样子:

{
  "id": 100,
  "name": "测试项目",
  "version": "3.1",
  "steps": [
    {
      "id": 18,
      "action": "Prepare",
      "expects": [
        {
          "id": 238,
          "result": "GOOD"
        },
        {
          "id": 239,
          "result": "PERFECT"
        }
      ]
    }
  ]
}

虽然格式化以后可读性也不错,但编辑起来就费劲了。这还仅仅是三层嵌套,括号对齐就有点吓人。

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打开它的样子)。

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文档差不多,堪称程序员福利啊。

缺点

当然这世上没有银弹,YAML也有它固有的缺点。

  • 首先开头提到过,它的扩展性差——这一点上XML优势明显,它每个标签有attribute,可以任意定义“元数据”,比如示例中的datatype,这是YAML和JSON的共同弱项;如果实在需要,就只能把元数据也放在数据项中,然后用特殊的字符前缀来标识(类似Python对象中的__dict__)
  • 其次它对格式要求很严格,没法以“紧凑”形式表达:比如不需要人读的时候,我们可以把JSON串压缩在一行,尽可能去除所有空格,这个YAML显然做不到。
  • 还有就是各种语言中,对YAML的支持都还不够成熟,尤其是序列化/反序列化部分,现有的库都很不方便。

结论

如果没有强烈的第三方扩展性需求,YAML是配置文件的最佳选项。当然,为此付出的代价,就是一开始需要手写一点点序列化/反序列化代码。


songofhawk
303 声望24 粉丝