YAML是一个可读性高,用来表达数据序列化的格式,YAML参考了其他多种语言,包括:C语言、Python、Perl,并从XML、电子邮件的数据格式(RFC 2822)中获得灵感。当前已经有多种编程语言或脚本语言支持(解析)这种语言。
yaml语言的设计目标,就是方便读写,实质上是一种通用的数据串行化格式。
- 大小写敏感
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- #表示注释,从#开始到行尾会被解析器忽略
- 对象
即键值对的集合,也称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 数组
一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 纯量
单个的、不可再分的值
下面就分别详细介绍这三种数据格式。
对象是键值对形式,使用冒号的结构来表示:
animal: cat
转为JavaScript如下:
{animal: 'cat'}
YAML也允许另一种写法:
animal: { name: cat, color: black }
转为JavaScript如下:
{ animal: { name: cat, color: black } }
YAML文件中的数组是一组连词线开头的行,如:
- cat
- dog
- pig
转为JavaScript如下:
['cat', 'dog', 'pig']
若某个数据结构的子成员是一个数组,可以在该项的下面使用缩进来表示,如:
- animal
- cat
- dog
- pig
转为JavaScript如下:
[['cat', 'dog', 'pig']]
数组也可以采用行内的表示方法:
animal: [cat, dog, pig]
转为JavaScript如下:
{animal: ['cat', 'dog', 'pig']}
在YAML中,对象和数组可以结合使用,形成复合结构。
language:
- python
- go
- java
networks:
name: python.org
url: http://x.x.x.x
转为JavaScript如下:
{language: ['python', 'go', 'java'],
networks:
{name: 'python.org',
url: 'http://x.x.x.x'}}
纯量是最基本、不可再分的值,主要有以下一些 :
- 字符串
- 布尔值
- 整数
- 浮点数
- NULL
- 时间
- 日期
数值
数值直接以字面量的形式表示
number: 12.30
转为JavaScript如下:
{number: 12.30}
布尔值
布尔值有true和false两种,
isFlag: ture
isSet: false
转为JavaScript如下:
{isFlag: ture,
isSet: false}
NULL
YAML中,NULL用~表示
tree: ~
转为JavaScript如下:
{tree: null}
时间采用 ISO8601 格式
iso8601: 2001-12-14t21:59:43.10-05:00
转为 JavaScript 如下:
{ iso8601: new Date('2001-12-14t21:59:43.10-05:00') }
日期
日期采用复合 iso8601 格式的年、月、日表示。
date: 1976-07-31
转为 JavaScript 如下:
{ date: new Date('1976-07-31') }
强制类型转换
YAML 允许使用两个感叹号,强制转换数据类型
e: !!str 123
f: !!str true
转为 JavaScript 如下:
{ e: '123', f: 'true' }
在YAML中,字符串默认不使用引号。
name: 这是一行字符串
转为 JavaScript 如下:
{name: '这是一行字符串 '}
若字符串中包含空格或特殊字符,需要放在引号中
name: '内容: 字符串'
转为 JavaScript 如下:
{name: '内容: 字符串'}
单引号和双引号都可以使用,但双引号不会对特殊字符转义,单引号可以
s1: '内容\n字符串'
s2: "内容\n字符串"
转为 JavaScript 如下:
{ s1: '内容\\n字符串', s2: '内容\n字符串' }
单引号之中如果还有单引号,必须连续使用两个单引号转义
string: 'habor''s day'
转为 JavaScript 如下:
{string: 'habor \'s day'}
字符串可以写成多行,从第二行开始,需要用一个单空格缩进。换行符会被转为空格。
str: 这是一段
多行
字符串
转为 JavaScript 如下:
{ str: '这是一段 多行 字符串' }
多行字符串可以使用|保留换行符,也可以使用>折叠换行
this: |
Foo
Bar
that: >
Foo
Bar
转为 JavaScript 如下:
{ this: 'Foo\nBar\n', that: 'Foo Bar\n' }
+表示保留文字块末尾的换行,-表示删除字符串末尾的换行
s1: |
Foo
s2: |+
Foo
s3: |-
Foo
转为 JavaScript 代码如下:
{ s1: 'Foo\n', s2: 'Foo\n\n\n', s3: 'Foo' }
锚点&和别名*,可以用来引用
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),<<表示合并到当前数据,*用来引用锚点