配置文件选型——为什么要用YAML?
Posted songofhawk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了配置文件选型——为什么要用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表示,会更加复杂,像下面这段,在没有语法高亮的情况下,读起来对人是一种折磨:
<?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是配置文件的最佳选项。当然,为此付出的代价,就是一开始需要手写一点点序列化/反序列化代码。
以上是关于配置文件选型——为什么要用YAML?的主要内容,如果未能解决你的问题,请参考以下文章