YAML 的定义是:“YAML Ain ’ t a Markup Language”,或者“Yet Another Markup Language”。
特点
- YAML 的数据组织主要依靠的是空白,缩进,分行等结构,可读性好。
- YAML 实现简单,解析成本很低,和脚本语言的交互性好。
- YAML 很容易就可以插入另一个 YAML 文件,甚至其他类型的文件,包括 XML, SDL, JSON 等。
- YAML 使用实现语言的数据类型。
- YAML 可以基于流来处理;
- YAML 表达能力强,扩展性好。
说明
基础
- 使用空白字符(不能使用Tab)分层,同层元素左侧对齐;
- 用“-”来表示一些序列的项(Sequence);
- 用“:”来表示一对项目(Map)里的栏目(Key)和其相应的值(Value);
- 单行注解由“#”字号开始,可以出现在行中任何位置;
- 字符串一般不使用引号,但必要的时候可以用引号框住;
- YAML也有用来描述好几行相同结构的数据的缩写语法,数组用“[]”包括起来,hash用“{}”来包括。
其它
- YAML使用可打印的Unicode字符,可使用UTF-8或UTF-16
- 使用双引号表示字串时,可用倒斜线(\)进行特殊字符转义
- 区块的字串用缩排和修饰词(非必要)来和其他资料分隔,有新行保留(使用符号<kbd>|</kbd>)或新行折叠(使用符号<kbd>></kbd>)两种方式
- 在单一档案中,可用连续三个连字号(---)区分多个档案
- 可选择性的连续三个点号(...)用来表示档案结尾(在流式传输时非常有用,不需要关闭流即可知道到达结尾处)
- 重复的内容可使从参考标记星号 (*)复制到锚点标记(&)
- 指定格式可以使用两个惊叹号 ( !! ),后面接上名称
- 允许在文件中加入选择性的空行,以增加可读性
- 在缩排中空白字符的数目并不是非常重要,只要相同阶层的元素左侧对齐就可以了
实例
简单实例
John.yaml
name: John Smith
age: 37
spouse:
name: Jane Smith
age: 25
children:
- name: Jimmy Smith
age: 15
- name: Jenny Smith
age: 12
John今年37岁,有一个幸福的四口之家。两个孩子Jimmy 和Jenny活泼可爱。妻子Jane年轻美貌。
也可缩写为:
name: John Smith
age: 37
spouse: {name: Jane Smith, age: 25}
children: [{name: Jimmy Smith, age: 15}, {name: Jenny Smith, age: 12}]
用 YAML 表达的一个购物发票
--- !clarkevans.com/^invoice
invoice: 34843
date : 2001-01-23
bill-to: &id001
given : Chris
family : Dumars
address:
lines: |
458 Walkman Dr.
Suite #292
city : Royal Oak
state : MI
postal : 48046
ship-to: *id001
product:
- sku : BL394D
quantity : 4
description : Basketball
price : 450.00
- sku : BL4438H
quantity : 1
description : Super Hoop
price : 2392.00
tax : 251.42
total: 4443.52
comments: >
Late afternoon is best.
Backup contact is Nancy
Billsmer @ 338-4338.
比较
JSON
JSON的语法是YAML1.2版的子集,同时非常接近YAML1.0与1.1版的子集,因此大部分的JSON文件都可以被YAML的剖析器剖析。这是因为JSON的语法结构和YAML的内置格式相同。虽然大范围的分层也可以使用类似JSON的内置格式,不过YAML标准并不建议这样使用,除非这样编写能让文件可读性增加。YAML的许多扩展在JSON是找不到的,如:进阶资料形态、关系锚点、字串不需要双引号、映射资料形态会储存键值的顺序。