软件程序为了描述数据不遗余力有多重方式, 早期windows上有.ini文件, linux上有.conf文件. 后来.xml几乎成为了标配, 以及从.xml衍生的apple格式.plist.
xml衍生自html, 刚刚出来的时候大家都很兴奋, 确实在一段时间内几乎成为了一统江湖的格式. 然而xml与html不同的是, 在html中标签名称都比较简单短小, xml描述数据后key根据不同软件要求变得复杂, 前后一个括号将key写两遍变得很臃肿, key+value一共得占用三行,篇幅大阅读性也不够好.
后来json出来了, 大家就又松了口气, 舒服多了, key+value一行就够了, 写起来也舒服.
而现在yaml是要比json写更少内容的了. 甚至连大括号中括号都不用, 逗号也不用, 引号也不用, 所占用的行也没有了.
# 注释
name: John Smith
age: 37
spouse:
name: Jane Smith
age: 25
children:
- name: Jimmy Smith
age: 15
- name: Jenny Smith
age 12
从内容上看起来让人想到了python和markdown. 使用缩进, 描述语言更容易阅读. 上面这段包含了key value关系, 层次关系, 列表(数组)关系.
对比json:
- 用缩进替代大括号表示层次关系, 这是python的手段;
- 用回车替代逗号表示不同元素, 这也是python的手段
- 继承了json使用冒号分隔key和value的方式
- 用减号替代方括号表示列表, 这是markdown的方式
- 注释使用井号#, 这是python的方式
- 字符串断行使用反斜杠\, 这与js是相同的.
- 最有趣的是, 如果你想在一行里面写多个元素, 你还可以使用js的[],{}语法
---
- [name , hr, avg ]
- [Mark McGwire, 65, 0.278]
- [Sammy Sosa , 63, 0.288]
---
Mark McGwire: {hr: 65, avg: 0.278}
Sammy Sosa: {
hr: 63,
avg: 0.288
}
- 还有个比json强大的地方, 可以使用&定义常量并在后面使用星号*引用, 如
name: &JS Jhon Smith
nameagain: *JS
- 有一个现在不太明白怎么用的, 就是使用三减号---分隔不同文档,使用三点...终结文档. 这样可以在一个文档里描述多个文档, 干嘛用? spec里说用在通信频道上?不清楚列
- 非常神奇的是, 可以使用一个复杂的对象作为key,而不是仅限于string, 这时候key需要以问号?开头
? - Detroit Tigers
- Chicago cubs
:
- 2001-07-23
? [ New York Yankees,
Atlanta Braves ]
: [ 2001-07-02, 2001-08-12,
2001-08-14 ]
number: 123
float: 123.13
string: something is something
string2: "123"
bool: true
canonical: 2001-12-15T02:59:43.1Z
iso8601: 2001-12-14t21:59:43.10-05:00
spaced: 2001-12-14 21:59:43.10 -5
date: 2002-12-14
- 其他复杂的类型, 有些需要!!说明, 其他需要编程语言自己搞定. 通常是在key后面加叹号描述类型
---
not-date: !!str 2002-04-28
picture: !!binary |
R0lGODlhDAAMAIQAAP//9/X
17unp5WZmZgAAAOfn515eXv
Pz7Y6OjuDg4J+fn5OTk6enp
56enmleECcgggoBADs=
application specific tag: !something |
The semantics of the tag
above may be different for
different documents.
# Sets are represented as a
# Mapping where each key is
# associated with a null value
--- !!set
? Mark McGwire
? Sammy Sosa
? Ken Griff
%TAG ! tag:clarkevans.com,2002:
--- !shape
# Use the ! handle for presenting
# tag:clarkevans.com,2002:circle
- !circle
center: &ORIGIN {x: 73, y: 129}
radius: 7
- !line
start: *ORIGIN
finish: { x: 89, y: 102 }
- !label
start: *ORIGIN
color: 0xFFEEBB
text: Pretty vector drawing.
# Ordered maps are represented as
# A sequence of mappings, with
# each mapping having one key
--- !!omap
- Mark McGwire: 65
- Sammy Sosa: 63
- Ken Griffy: 58