YAML教程

2,111 阅读3分钟

YAML设计理念

YAML: YAML Ain't Markup Language What It Is: YAML is a human friendly data serialization standard for all programming languages.

以上是YAML官网对其的说明,简言之就是:YAML是以人为本的各语言通用的数据序列化标准。

---
Time: 2001-11-23 15:01:42 -5
User: ed
Warning:
  This is an error message
  for the log file
---
Time: 2001-11-23 15:02:31 -5
User: ed
Warning:
  A slightly different error
  message.
---
Date: 2001-11-23 15:03:17 -5
User: ed
Fatal:
  Unknown variable "bar"
Stack:
  - file: TopClass.py
    line: 23
    code: |
      x = MoreObject("345\n")
  - file: MoreClass.py
    line: 58
    code: |-
      foo = bar

简介

YAML实质上就是一种通用的数据串行化格式。提供一种各语言通用的文件配置格式。其基本的基本语法规则如下:

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

其支持的数据格式主要是三种:

  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
  • 纯量(scalars):单个的、不可再分的值

对象

对象是一组键值对,使用结构表示。

person:
 name: Jam
 age: 27

转换成JavaScript如下。

{ person: { name: 'Jam', age: 27 } }

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

person: {name: Jam, age: 27}

转换成JavaScript如下。

{ person: { name: 'Jam', age: 27 } }

数组

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

- yaml
- json

转换成JavaScript如下。

[ 'yaml', 'json' ]

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

[yaml, json]

转换成JavaScript如下。

[ 'yaml', 'json' ]

多维数组表示如下。

-
 - yaml
 - json

转换成JavaScript如下。

[ [ 'yaml', 'json' ] ]

纯量

纯量是最基本的、不可再分的值。

  • 字符串
  • 布尔值
  • 整数
  • 浮点数
  • Null
  • 时间
  • 日期
person:
 name: Jam
 nickname: 'Jam: J'
 male: true
 age: 27
 height: 1.75
 child: ~
 birth: 2001-12-14t21:59:43.10-05:00
 today: 2020-01-01
 female: !!str false

转换成JavaScript如下。

{ person: 
   { name: 'Jam',
     nickname: 'Jam: J',
     male: true,
     age: 27,
     height: 1.75,
     child: null,
     birth: Sat Dec 15 2001 10:59:43 GMT+0800 (中国标准时间),
     today: Wed Jan 01 2020 08:00:00 GMT+0800 (中国标准时间),
     female: 'false' } }

复合结构

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

web:
 - node
 - javascript
 - html
 - css
books:
 -
  name: 数据结构
 -
  name: 算法导论

转换成JavaScript如下。

{ web: [ 'node', 'javascript', 'html', 'css' ],
  books: [ { name: '数据结构' }, { name: '算法导论' } ] }

引用

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

default: &default
 name: YAML
doc:
 content: 'YAML Ain't Markup Language'
 <<: *default

转换成JavaScript如下。

{ default: { name: 'YAML' },
  doc: { content: 'YAML Ain\'t Markup Language', name: 'YAML' } }

注释

YAML中使用#表示注释,从这个字符一直到行尾,都会被解析器忽略。