在线 YAML、JSON 互转:http://nodeca.github.io/js-yaml/
YAML(发音 /ˈjæməl/ )是"YAML Ain’t a Markup Language"的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”,但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。
1 基本规则
- 大小写敏感
- 使用缩进表示层级关系
- 禁止使用 tab 缩进,只能使用空格键
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- 使用 # 表示注释
- 字符串可以不用引号标注
2 三种数据结构
2.1 对象
键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
对象的一组键值对,使用冒号结构表示。
# JSON 表示
{'age':12,'name':'huang'}
# YAML 多行表示
age : 12
name : huang
# YAML 行内表示
{age:12, name:huang}
2.2 List 数组
一组按次序排列的值,又称为序列(sequence) / 列表(list)
一组连词线开头的行,构成一个数组。
# JSON 表示
['a','b',12]
# YAML 多行表示
- a
- b
- 12
# YAML 行内表示
[a, b, c]
2.3 Scalar 纯量
纯量是最基本的、不可再分的值。
1)其它
- 布尔值
- 用 true 和 false 表示
- 数值
- 以字面量的形式表示
- Null
- 用 ~ 表示
- 时间
- 采用 ISO8601 格式:2001-12-14t21:59:43.10-05:00
- 日期
- 采用复合 ISO8601 格式的年、月、日表示:1976-07-31
2)字符串
引号
- 默认不使用引号表示
- 如果字符串之中包含空格或特殊字符,则需要放在引号之中
- 单引号和双引号都可以使用,双引号不会对特殊字符转义
- 单引号之中如果还有单引号,必须连续使用两个单引号转义
# YAML 表示
s1: '内容\n字符串'
s2: "内容\n字符串"
str: 'labor''s day'
# JSON 表示
{ s1: '内容\\n字符串', s2: '内容\n字符串', str: 'labor\'s day' }
单字符串换行
- 字符串可以写成多行,从第二行开始,必须有一个单空格缩进。换行符会被转为空格。
# YAML 表示
str: 这是一段
多行
字符串
# JSON 表示
{ str: '这是一段 多行 字符串' }
多行字符串
- 多行字符串可以使用 | 保留换行符,也可以使用 > 折叠换行。
# YAML 表示
this: |
Foo
Bar
that: >
Foo
Bar
# JSON 表示
{ this: 'Foo\nBar\n', that: 'Foo Bar\n' }
- + 表示保留文字块末尾的换行,- 表示删除字符串末尾的换行。
# YAML 表示
s1: |
Foo
s2: |+
Foo
s3: |-
Foo
# JSON 表示
{ s1: 'Foo\n', s2: 'Foo\n\n\n', s3: 'Foo' }
HTML
字符串之中可以插入 HTML 标记。
# YAML 表示
message: |
<p style="color: red">
段落
</p>
# JSON 表示
{ message: '\n<p style="color: red">\n 段落\n</p>\n' }
3)强制转换
YAML 允许使用两个感叹号,强制转换数据类型。
# YAML 强制转换
e: !!str 123
f: !!str true
# 转为 JSON 如下。
{ e: '123', f: 'true' }
3 数据结构嵌套
Map 和 List 的元素可以是另一个 Map 或者 List 或者是纯量。由此出现 4 种常见的数据嵌套:
3.1 Map 嵌套 Map
# JSON 表示
{
websites:
{
YAML: 'yaml.org',
Ruby: 'ruby-lang.org',
Python: 'python.org',
Perl: 'use.perl.org'
}
}
# YAML 表示
websites:
YAML: yaml.org
Ruby: ruby-lang.org
Python: python.org
Perl: use.perl.org
3.2 Map 嵌套 List
# JSON 表示
{ languages: [ 'Ruby', 'Perl', 'Python', 'c' ] }
# YAML 表示
languages:
- Ruby
- Perl
- Python
- c
3.3 List 嵌套 List
# JSON 表示
[ [ 'Ruby', 'Perl', 'Python' ], [ 'c', 'c++', 'java' ] ]
# YAML 表示 1
-
- Ruby
- Perl
- Python
-
- c
- c++
- java
# YAML 表示 2
- - Ruby
- Perl
- Python
- - c
- c++
- java
# YAML 表示 3
- [Ruby,Perl,Python]
- [c,c++,java]
3.4 List 嵌套 Map
# JSON 表示
[ { id: 1, name: 'huang' }, { id: 2, name: 'liao' } ]
# YAML 表示
-
id: 1
name: huang
-
id: 2
name: liao
4 引用
& 用来建立锚点(defaults),<< 表示合并到当前数据,* 用来引用锚点。
defaults: &defaults
adapter: postgres
host: localhost
development:
database: myapp_development
<<: *defaults
- &showell Steve
- Clark
- Brian
- Oren
- *showell
等同于下面的代码。
defaults:
adapter: postgres
host: localhost
development:
database: myapp_development
adapter: postgres
host: localhost
[ 'Steve', 'Clark', 'Brian', 'Oren', 'Steve' ]