YAML 入门指南
YAML 简介
我们使用 YAML 是因为它像 XML 或 JSON 是一种利于人们读写的数据格式。YAML 语言(发音 /ˈjæməl/ )的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式。
格式注意
- 使用缩进表示层级关系
- 缩进不允许使用 tab ,只能使用空格
- 空格的个数不重要,但是相同层级的元素需要左对齐
- 冒号后如果有值,格式为key: value。冒号后要有一个空格
- 不要使用 “=” 号
- 大小写敏感
- “#” 作为注释,并且只有行注释
- 使用 “---” 表示一个文档的开始
YAML 的数据结构
简单的说 YAML 支持的数据结构有三种。
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 常量(scalars):单个的、不可再分的值
下面简单描述下
对象
对象的一组键值对,使用冒号结构表示。
使用冒号代表,格式为key: value。冒号后面要加一个空格:
key: value
转为 JavaScript 如下。
{ key: 'value' }
可以使用缩进表示层级关系;
key:
child-key: value
child-key2: value2
也允许另一种写法,将所有键值对写成一个行内对象。
key: { child-key: value, child-key2: value2 }
转为 JavaScript 如下。
{ key: { child-key: 'value', child-key2: 'value2' } }
数组
使用一个短横线加一个空格代表一个数组项。
fruit:
- Apple
- Orange
- Strawberry
- Mango
转为 JavaScript 如下。
{ fruit: [ 'Apple', 'Orange', 'Strawberry' ,'Mango' ] }
当然也可以有这样的写法。
-
- Apple
- Orange
- Strawberry
- Mango
转为 JavaScript 如下。
{ [ [ 'Apple', 'Orange', 'Strawberry' ,'Mango' ] ] }
数组也可以采用行内表示法。
fruit: [ Apple, Orange, Strawberry, Mango ]
转为 JavaScript 如下。
{ fruit: [ 'Apple', 'Orange', 'Strawberry' ,'Mango' ] }
一个相对复杂的例子:
fruits:
-
id: 1
name: Apple
price: 10
-
id: 2
name: Orange
price: 8
意思是 fruits 属性是一个数组,每一个数组元素又是由 id,name,price 三个属性构成。
数组也可以使用流式 (flow) 的方式表示:
fruits: [ { id: 1 ,name: Apple ,price: 10 } ,{ id: 2 ,name: company2 ,price: 8 } ]
常量
YAML中提供了多种常量结构。
- 字符串
- 布尔值
- 整数
- 浮点数
- Null
- 时间
- 日期
数值直接以字面量的形式表示。
number: 12.30
number: 6.8523015e+5 #可以使用科学计数法
number: 0b1010_0111_0100_1010_1110 #二进制表示
布尔值
create_key: yes
needs_agent: no
knows_oop: True
likes_emacs: TRUE
uses_cvs: false
null 用 ~ 表示
parent: ~
时间采用 ISO8601 格式。
datetime: 2018-12-14T21:59:43.10-05:00 #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
转为 JavaScript 如下。
{ iso8601: new Date('2018-12-14t21:59:43.10-05:00') }
日期采用复合 iso8601 格式的年、月、日表示。
date: 1976-07-31 #日期必须使用ISO 8601格式,即yyyy-MM-dd
字符串
字符串是最常见,也是最复杂的一种数据类型。
string:
- 哈哈
- 'Hello world' #可以使用双引号或者单引号包裹特殊字符
- newline
newline2 #字符串可以拆成多行,每一行会被转化成一个空格
一些特殊符号
文档的开始和结束
YAML 可以在同一个文件中,使用 “---” 表示一个文档的开始;比如 Springboot 中 profile 的定义
server:
address: 192.168.1.100
---
spring:
profiles: development
server:
address: 127.0.0.1
---
spring:
profiles: production
server:
address: 192.168.1.120
“...” 和 “---” 配合使用,在一个配置文件中代表一个文件的结束
---
time: 20:03:20
player: Sammy Sosa
action: strike (miss)
...
---
time: 20:03:47
player: Sammy Sosa
action: grand slam
...
类型转换
YAML 允许使用两个感叹号,强制转换数据类型。
e: !!str 123
f: !!str true
转为 JavaScript 如下。
{ e: '123', f: 'true' }
当然允许转型的类型很多
!!set
- Mark McGwire: 65
- Sammy Sosa: 63
- Sammy Sosa: 63
- Ken Griffy: 58
转为 JavaScript 如下。
{ [ { Ken Griffy=58 }, { Mark McGwire=65 }, { Sammy Sosa=63 } ] } #将数组解析为集合 ,重复的 Sammy Sosa 会被去掉;
引用
锚点& 和别名*,可以用来引用。
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
&用来建立锚点(defaults),<<表示合并到当前数据,*用来引用锚点。
下面是另一个例子。
- &showell Steve
- Clark
- Brian
- Oren
- *showell
转为 JavaScript 代码如下。
{ [ 'Steve', 'Clark', 'Brian', 'Oren', 'Steve' ] }
网友评论