配置文件选型——为什么要用YAML()

开宗明义: 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表示,会更加复杂,像下面这段,在没有语法高亮的情况下,读起来对人是一种折磨:
100: 100 测试项目 3.118, Prepare, 238 GOOD239 PERFECT

要想手敲这段代码,更是容易出错:各种标签不封闭,嵌套层级混乱之类的。(想象一下远程登录到服务器,用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()】如果没有强烈的第三方扩展性需求,YAML是配置文件的最佳选项。当然,为此付出的代价,就是一开始需要手写一点点序列化/反序列化代码。

    推荐阅读