Yaml

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

基本语法

  • 使用Unicode字符,可以使用UTF-8或者UTF-16

  • 大小写敏感

  • 使用缩进表示层级关系,缩进时不允许使用Tab键,只允许使用空格

  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

  • 在单一文件中,可用连续三个连字号---区分多个文件,有选择性的连续三个点号( ... )用来表示文件结尾

纯量(scalars)数据

字符串

  • 单行字符串

    # 普通形式
    string1: hello world!
    
    # 单引号,不会解析任何转义字符,所有内容都会原样输出
    string2: 'hello\nworld!'
    # 如果要表示单引号,需要使用 ''
    string3: 'hello ''world!'''
    
    # 双引号,会解析转义字符,如果要表示\,需要使用\\
    string4: "hello\nworld!"
    {
      "string1": "hello world!",
      "string2": "hello\\nworld!",
      "string3": "hello 'world!'",
      "string4": "hello\nworld!"
    }
  • 多行字符串,每行的换行以及空格会被转换为单个空格字符

    # 普通样式,不支持转义字符,每行行尾空格不保留
    lstr1: a
      bb\n
      ccc   #这里有空格
    # 单引号样式,不支持转义字符,'的输入需要使用''替代转义
    lstr2: 'a\n
    ''bb''
    ccc   '
    # 双引号样式,支持转义字符,\与"要进行转义处理,\放置在行尾可以删除空格
    lstr3: "a\n
    bb\"\
    ccc   "
    {
      "lstr1": "a bb\\n ccc",
      "lstr2": "a\\n 'bb' ccc   ",
      "lstr3": "a\n bb\"ccc   "
    }
  • 多行字符串,使用 >折叠换行符,将多行折叠为一行

    • 注意每行文字之前要有相同的缩进

    • 会在末尾添加换行符

    • 不会解析转义字符 \'", 他们都会被原样输出

    • 行与行之间会有空格

    bstr1: >
      'a'
      "bb"
      \ccc\
      dddd
    {
      "bstr1": "'a' \"bb\" \\ccc\\ dddd\n"
    }
  • 多行字符串,使用 |保留换行符

    • 注意每行文字之前要有相同的缩进

    • 会在末尾添加换行符

    • 不会解析转义字符 \'", 他们都会被原样输出

    • 行与行之间保留换行符,而不是空格

    bstr2: |
      'a'
      "bb"
      \ccc\
      dddd
    {
      "bstr2": "'a'\n\"bb\"\n\\ccc\\\ndddd\n"
    }
  • 多行字符串,使用 +-> 以及 | 进行样式裁剪

    • >| :“剪辑”:保持尾行换行符,删除尾随空白行。

    • >-|- :“strip”:删除尾行换行符,删除尾随空白行。

    • >+|+ :“keep”:保持尾行换行符,保持尾随空行。

    cstring1: |
      a
      bb
      
    cstring2: |-
      a
      bb
    
    cstring3: |+
      a
      bb
      
    {
      "cstring1": "a\nbb\n",
      "cstring2": "a\nbb",
      "cstring3": "a\nbb\n\n"
    }

数字

# 整数
number1: 0
number2: 100
# 八进制整数
number3: 014
# 十六进制整数
number4: 0xC
# 浮点数
number5: 10.01
# 指数
number6: 1.2e+34
{
  "number1": 0,
  "number2": 100,
  "number3": 12,
  "number4": 12,
  "number5": 10.01,
  "number6": 1.2e+34
}

空值

nul1: null
nul2: ~
{
  "nul1": null,
  "nul2": null
}

布尔

bol1: true
bol2: false
{
  "bol1": true,
  "bol2": false
}

时间和日期

使用 iso-8601 标准表示日期与时间

date1: 2018-01-01t16:59:43.10-05:00
date2: 1976-07-31

类型转换

Yaml 内置的类型列表:

类型描述

int

整数

float

浮点数

bool

布尔

str

字符串

binary

字符串

timestamp

日期时间

null

set

集合

omp, pairs

键值列表或对象列表

seq

序列,也是列表

map

键值表

使用!进行类型转换,如果是单个!,代表转换类型为自定义类型,如果是!!则是内置类型:

!!int # 整数类型 
!!float # 浮点类型 
!!bool # 布尔类型 
!!str # 字符串类型 
!!binary # 也是字符串类型 
!!timestamp # 日期时间类型 
!!null # 空值 
!!set # 集合 
!!omap,!!pairs # 键值列表或对象列表
!!seq # 序列,也是列表 
!!map # 键值表

对象数据

  • 一个yaml文档就是一个对象:

    animal:
      dog:
        name: 旺财
        age: 2
    {
      "animal": {
        "dog": {
          "name": "旺财",
          "age": 2
        }
      }
    }
  • 行内对象

    animal:
      dog: {name: 旺财, age: 2}
    {
      "animal": {
        "dog": {
          "name": "旺财",
          "age": 2
        }
      }
    }

数组数据

  • 一组连词线开头的行,构成一个数组:

    hobby:
      - 打篮球
      - 玩游戏
      - 看视频
    {
      "hobby": [
        "打篮球",
        "玩游戏",
        "看视频"
      ]
    }
  • 行内数组

    hobby: [打篮球, 玩游戏, 看视频]
    {
      "hobby": [
        "打篮球",
        "玩游戏",
        "看视频"
      ]
    }

引用

引用对象

defaults: &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

引用单个值

- &showell Steve
- Clark
- Brian
- Oren
- *showell 

等同于

- Steve
- Clark
- Brian
- Oren
- Steve

参考

最后更新于