YAML是一种可读性高,用来表达数据序列化的标记语言,语法和其他高级语言类似,可以简单表达清单、散列表,标量等数据形态。其使用空格来缩进和大量依赖外观的特色,特别适合用于表达或编辑数据结构和各种配置文件(许多电子邮件标题格式和YAML非常接近)。
YAML是“YAML Ain't a Markup Language”(YAML不是一种标记语言)的递归缩写。在开发这种语言时,YAML的意思实为“Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。
YAML配置文件后缀为.yml
或.yaml
,例如hyperplasma.yml
。
YAML官网:yaml.org
JS-YAML转换:nodeca.github.io/js-yaml
1 基本语法
YAML基本语法规则如下:
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
#
表示注释
本文为排版美观,使用tab表示4个空格的缩进。实际使用各种IDE编辑yaml文件时均会自动将tab转换为指定数量的空格。
2 数据类型
YAML支持以下几种数据类型:
- 对象:键值对的集合,又称为映射(Mapping)/ 哈希(Hash) / 字典(Dictionary)
- 数组:一组按次序排列的值,又称为序列(Sequence) / 列表(List)
- 纯量(Scalars):不可再分的单个值
3 YAML对象
对象的几种表示形式:
- 对象键值对使用冒号结构表示(
:
),注意冒号后要加一个空格。
key: value
- 使用大括号(
{ }
)包裹键值对
key: {child-key1: value1, child-key2: value2}
- 使用缩进,效果与第2种相同
key:
child-key1: value1
child-key2: value2
- 使用问号(
?
)代表一个复杂的key,配合冒号(:
)代表一个value。如下所示,该写法表示对象的属性是一个数组[complexkey1, complexkey2]
,对应的值也是一个数组[complexvalue1,complexvalue2]
?
- complexkey1
- complexkey2
:
- complexvalue1
- complexvalue2
4 YAML数组
以-
开头的一系列连续行表示构成一个数组:
- A
- B
- C
YAML支持多维数组,可以使用行内表示:
key: [value1, value2, ...]
类似对象若某数据结构的子成员是一个数组,则子成员缩进:
companies:
-
id: 1
name: company1
price: 20m
-
id: 2
name: company2
price: 50m
上述companies
案例亦可使用流式(flow)表示:
companies: [{id: 1, name: company1, price: 200W}, {id: 2, name: company2, price: 500W}]
【例】数组和对象可以构成复合结构,其yaml结构及对应的JS对象表示如下
languages:
- Ruby
- Perl
- Python
websites:
YAML: yaml.org
Ruby: ruby-lang.org
Python: python.org
Perl: use.perl.org
{
languages: [ 'Ruby', 'Perl', 'Python'],
websites: {
YAML: 'yaml.org',
Ruby: 'ruby-lang.org',
Python: 'python.org',
Perl: 'use.perl.org'
}
}
5 纯量
纯量是最基本的,不可再分的值,包括:- 字符串
- 布尔值
- 整数
- 浮点数
- Null
- 时间
- 日期
boolean: # 布尔值
- TRUE # 亦可写为true、True
- FALSE # 亦可写为false、False
float: # 浮点数
- 3.14
- 6.8523015e+5 # 科学计数法
int: # 整数
- 123
- 0b1010_0111_0100_1010_1110 # 二进制表示
null: # Null
nodeName: 'node'
parent: ~ # 波浪线(~)表示null
string: # 字符串
- Hyplus # 默认不使用引号表示
- 'Hello Akira' # 亦可用双引号或单引号包裹特殊字符
date:
- 2018-02-17 # 日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime:
- 2018-02-17T15:02:31+08:00 # 时间使用ISO 8601格式,时间和日期之间用T连接,末尾用+代表时区
字符串可以拆成多行,每次换行会被转化为一个空格。多行字符串可以使用|
保留换行符,也可以使用>
折叠换行。基本语法及对应的JS对象表示如下:
this: |
Hyplus
Akira
that: >
Hyplus
Akira
{this: 'Hyplus\nAkira\n', that: 'Hyplus Akira\n'}
+
表示保留文字块末尾的换行,-
表示删除字符串末尾的换行。基本语法及对应的JS对象表示如下:
s1: |
HyPress
s2: |+
HyPress
s3: |-
HyPress
{s1: 'HyPress\n', s2: 'HyPress\n\n\n', s3: 'HyPress'}
字符串中可以插入HTML标签:
message: |
<p style="color: red">
段落
</p>
6 数据类型转换
可以使用两个感叹号(!!
)+数据类型来强制转换数据类型:
e: !!str 123
f: !!str true
对应的JS对象表示为
{e: '123', f: 'true'}
7 锚点引用
锚点和别名用于引用。&
用于建立锚点(Defaults),<<
表示合并到当前数据,*
用于引用锚点。
【例1】&
、<<
、*
的使用例:
defaults: &defaults # 添加锚点
adapter: postgres
host: localhost
development:
database: myapp_development
<<: *defaults
test:
database: myapp_test
<<: *defaults
相当于
defaults:
adapter: postgres
host: localhost
development:
database: myapp_development
adapter: postgres
host: localhost
test:
database: myapp_test
adapter: postgres
host: localhost
【例2】数组中的使用例及对应的JS对象表示:
- &yohane Yoshiko
- Teresa
- KINA
- Xiao
- *yohane
[ 'Yoshiko', 'Teresa', 'KINA', 'Xiao', 'Yoshiko' ]