
# YAML语法
YAML 是一种简洁强大的语言，它的设计目标是便于设计和使用人员阅读。
#### 基本语法规则
- 大小写敏感。
- 使用缩进表示层级关系。
- 缩进时不允许使用Tab键，只允许使用空格。
- 缩进的空格数目不重要，要求相同层级的元素左侧对齐。
- 使用#表示注释。
 
#### YAML支持三种数据结构
- 对象：键值对的集合，又称为映射（mapping）/ 哈希（hashes）/ 字典（dictionary）。
- 数组：一组按次序排列的值，又称为序列（sequence） / 列表（list）。
- 纯量（scalars）：数据最小的单位， 单个的、不可再分的值。
 
#### 对象
对象是一组键值对（key: value，冒号后面必须有一个空格或换行），合法的表示方法如下：
```
animal: pets
plant:
  tree
```
也可以将多个键值对写成一个行内对象：
```
hash: {name: Steve, foo: bar}
```
下面这种情况会出错
```
foo: somebody said I should put a colon here: so I did
windows_drive: c:
```
用引号括起来就没有问题，如下所示
```
foo: 'somebody said I should put a colon here: so I did'
windows_drive: 'c:'
```
#### 数组
数组使用连字符和空格"- "表示，合法的表示方法如下：
```
animal:
- Cat
- Dog
- Goldfish
```
也可使用行内表示法：
```
animal: [Cat, Dog, Goldfish]
```
对象和数组可以嵌套使用，形成复合结构：
```
languages:
 - Ruby
 - Perl
 - Python
websites: 
 YAML: yaml.org
 Ruby: ruby-lang.org
 Python: python.org
 Perl: use.perl.org
```
#### 纯量
纯量的数据类型有字符串、布尔值、整数、浮点数、Null、时间、日期。
- 字符串表示： 字符串默认不使用引号表示：
  ```
  str: This_is_a_line
  ```
  如果字符串之中包含空格或特殊字符，需要放在引号之中：
  ```
  str: 'content: a string’
  ```
  单引号和双引号都可以使用，两者区别是单引号可以识别转义字符：双引号不会对特殊字符转义:↵
  ```
  s1: 'content:\n a string'
  s2: "content:\n a string"
  ```
  单引号之中如果还有单引号，必须连续使用两个单引号转义。
  ```
  str: 'labor''s day'
  ```
  字符串可以写成多行，从第二行开始，必须有一个单空格缩进。换行符会被转为空格。
  ```
  str: This_is
   a_multi_line
  ```
  
- 整数表示：
  ```
  int_value: 314
  ```
  
- 浮点型表示：
  ```
  float_value: 3.14
  ```
  
- Null表示：
  ```
  parent: ~
  ```
  
- 时间表示： 时间采用ISO8601格式。
  ```
  iso8601: 2018-12-14t21:59:43.10-05:00
  ```
  
- 日期表示： 日期采用复合ISO8601格式的年、月、日表示。
  ```
  date: 1976-07-31
  ```
  
 
#### 一些特殊符号
- "---"表示一个Yaml文件的开始，"..."表示一个Yaml文件的结束。
```
---
# 一个美味水果的列表
- Apple
- Orange
- Strawberry
- Mango
...
```
- 对于整数型、浮点型、布尔型数据用两个感叹号"!!"进行强制转换：
```
strbool: !!str true
strint: !!str 10
```
- 多行字符串可以使用"\|"保留换行符，也可以使用"\>"折叠换行。这两个符号是Yaml中字符串经常使用的符号。
```
this: |
 Foo
 Bar
that: >
 Foo
 Bar
```
对应的对象为：
```
{ this: 'Foo\nBar\n', that: 'Foo Bar\n' }
```
一般推荐使用"\|"就能够满足大多数场景了。
#### 注释
YAML支持注释，这是YAML相比JSON的一个优点。
YAML的注释使用"#"开头，如下所示。
```
languages:
 - Ruby                # 这是Ruby语言
 - Go                  # 这是Go语言
 - Python              # 这是Python语言
```
#### 参考文档
- [YAML 1.2 规格](http://yaml.org/spec/1.2/spec.html)
- [Ansible YAML Syntax](https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html)
- [YAML 语言教程](http://www.ruanyifeng.com/blog/2016/07/yaml.html)
 
