TOC
CHAT

YAML基础语法介绍

YAML是一种可读性高,用来表达数据序列化的标记语言,语法和其他高级语言类似,可以简单表达清单、散列表,标量等数据形态。其使用空格来缩进和大量依赖外观的特色,特别适合用于表达或编辑数据结构和各种配置文件(许多电子邮件标题格式和YAML非常接近)。

YAML是“YAML Ain't a Markup Language”(YAML不是一种标记语言)的递归缩写。在开发这种语言时,YAML的意思实为“Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。

YAML配置文件后缀为.yml.yaml,例如hyperplasma.yml

YAML官网:yaml.org

JS-YAML转换:nodeca.github.io/js-yaml

1 基本语法

YAML基本语法规则如下:

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进不允许使用tab,只允许空格
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • #表示注释

本文为排版美观,使用tab表示4个空格的缩进。实际使用各种IDE编辑yaml文件时均会自动将tab转换为指定数量的空格。


2 数据类型

YAML支持以下几种数据类型:

  • 对象:键值对的集合,又称为映射(Mapping)/ 哈希(Hash) / 字典(Dictionary)
  • 数组:一组按次序排列的值,又称为序列(Sequence) / 列表(List)
  • 纯量(Scalars):不可再分的单个值

3 YAML对象

对象的几种表示形式:

  1. 对象键值对使用冒号结构表示(:),注意冒号后要加一个空格。
key: value
  1. 使用大括号({ })包裹键值对
key: {child-key1: value1, child-key2: value2}
  1. 使用缩进,效果与第2种相同
key:
    child-key1: value1
    child-key2: value2
  1. 使用问号(?)代表一个复杂的key,配合冒号(:)代表一个value。如下所示,该写法表示对象的属性是一个数组[complexkey1, complexkey2],对应的值也是一个数组[complexvalue1,complexvalue2]
?
    - complexkey1
    - complexkey2
:
    - complexvalue1
    - complexvalue2

4 YAML数组

-开头的一系列连续行表示构成一个数组:

- A
- B
- C

YAML支持多维数组,可以使用行内表示:

key: [value1, value2, ...]

类似对象若某数据结构的子成员是一个数组,则子成员缩进:

companies:
    -
        id: 1
        name: company1
        price: 20m
    -
        id: 2
        name: company2
        price: 50m

上述companies案例亦可使用流式(flow)表示:

companies: [{id: 1, name: company1, price: 200W}, {id: 2, name: company2, price: 500W}]

【例】数组和对象可以构成复合结构,其yaml结构及对应的JS对象表示如下

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

5 纯量

纯量是最基本的,不可再分的值,包括:- 字符串

  • 布尔值
  • 整数
  • 浮点数
  • Null
  • 时间
  • 日期
boolean:    # 布尔值
    - TRUE  # 亦可写为true、True
    - FALSE # 亦可写为false、False
float:  # 浮点数
    - 3.14
    - 6.8523015e+5  # 科学计数法
int:    # 整数
    - 123
    - 0b1010_0111_0100_1010_1110    # 二进制表示
null:   # Null
    nodeName: 'node'
    parent: ~   # 波浪线(~)表示null
string: # 字符串
    - Hyplus    # 默认不使用引号表示
    - 'Hello Akira'   # 亦可用双引号或单引号包裹特殊字符
date:
    - 2018-02-17    # 日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime:
    - 2018-02-17T15:02:31+08:00 # 时间使用ISO 8601格式,时间和日期之间用T连接,末尾用+代表时区

字符串可以拆成多行,每次换行会被转化为一个空格。多行字符串可以使用|保留换行符,也可以使用>折叠换行。基本语法及对应的JS对象表示如下:

this: |
    Hyplus
    Akira
that: >
    Hyplus
    Akira
{this: 'Hyplus\nAkira\n', that: 'Hyplus Akira\n'}

+表示保留文字块末尾的换行,-表示删除字符串末尾的换行。基本语法及对应的JS对象表示如下:

s1: |
  HyPress

s2: |+
  HyPress

s3: |-
  HyPress
{s1: 'HyPress\n', s2: 'HyPress\n\n\n', s3: 'HyPress'}

字符串中可以插入HTML标签:

message: |
  <p style="color: red">
    段落
  </p>

6 数据类型转换

可以使用两个感叹号(!!)+数据类型来强制转换数据类型:

e: !!str 123
f: !!str true

对应的JS对象表示为

{e: '123', f: 'true'}

7 锚点引用

锚点别名用于引用。&用于建立锚点(Defaults),<<表示合并到当前数据,*用于引用锚点。

【例1】&<<*的使用例:

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

【例2】数组中的使用例及对应的JS对象表示:

- &yohane Yoshiko
- Teresa
- KINA
- Xiao
- *yohane
[ 'Yoshiko', 'Teresa', 'KINA', 'Xiao', 'Yoshiko' ]

发表评论