Paul

YAML 语言

编程免不了要写配置文件,怎么写配置文件也是一门学问。YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。

YAML 是 “YAML Ain’t a Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发这种语言时,YAML 的意思其实是 “Yet Another Markup Language”(仍是一种标记语言)。

YAML 的语法和其他高级语言类似,并且可以简单表达清单、散列表、数量等数据形式。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、文件大纲等。

YAML 的配置文件后缀名为 .yml,如 runoob.yml

基本语法

YAML 语言(发音 /ˈjæməl/ )的实际目的,就是方便人类读写。它实质上是一种通用的数据串行化格式。

它的基本语法规则如下:

另外需要注意的是,# 表示注释,从这个字符一直到行位,都会被解析器忽略。

数据类型

YAML 支持的数据类型有三种:

:::tip 提示 本文介绍的 YAML 语法以 JS-YAML 的实现为例,也可以去在线 Demo 验证下面的例子。 :::

对象

对象键值对使用冒号结构表示 key: value冒号后面要加一个空格

:::code-group

animal: pets
{ animal: 'pets' }

:::

还可以使用缩进表示层级关系:

:::code-group

hash:
  name: Steve
  foo: bar
{
  hash: { name: 'Setve', foo: 'bar' }
}

:::

YAML 也允许另一种写法:将所有键值对写成一个行内对象:

:::code-group

hash: { name: Steve, foo: bar }
{ hash: { name: 'Steve', foo: 'bar' } }

:::

数组

- 开头的行表示构成一个数组:

:::code-group

- Cat
- Dog
- Goldfish
['Cat', 'Dog', 'Goldfish']

:::

数组也可以采用行内表示法:

:::code-group

animal: [Cat, Dog]
{ animal: ['Cat', 'Dog'] }

:::

纯量

最基本的、不可再分的值,包括:字符串、布尔值、整数、浮点数、Null、时间、日期。

复杂结构

对象和数组可以结合使用,形成复杂结构:

:::code-group

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'
  }
}

:::

引用

锚点 & 和别名 *,可以用来引用:

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

& 用来建立锚点,<< 表示合并到当前数据,* 用来引用锚点。

下面是另一个例子:

:::code-group

- &showell Steve
- Clark
- Brian
- Oren
- *showell
[ 'Steve', 'Clark', 'Brian', 'Oren', 'Steve' ]

:::