YAML语法规则

8/12/2023 yaml

# YAML

YAML,发音 /ˈjæməl/,用于配置文件描述配置,本身是 JSON 的超集,由于 JSON 语法过于严格,且缺乏注释,因此引入了 YAML 格式。YAML 支持注释、换行符分隔、多行字符串、裸字符串和更灵活的类型系统,也支持引用文件,以避免重复代码。

YAML 是"YAML Ain't a Markup Language"(YAML 不是一种标记语言 (opens new window))的递回缩写 (opens new window)。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言 (opens new window))[4] (opens new window),但为了强调这种语言以数据为中心,而不是以标记语言为重点,而用反向缩略语重新命名。

YAML 最大的优势就是支持注释,这一点在 JSON 中是不支持的,因此在配置文件中,YAML 更加灵活,更加易读。

当前最新的 YAML 语法版本为 1.2.2

# 语法

基本语法规则:

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

一些符号规则:

  • 使用 # 表示注释,持续到行尾
  • 使用三个连接线[---]表示文件开始,一个文件内支持多个 YAML 文件,使用该符号分割
  • 使用三个英文句号[...]表示文件结束,非必须,串流时很有用

# 数据类型

# 基本数据结构

基本数据结构大致分为三类:对象、数组、纯量,除此之外

# 对象

格式:animal: pets,对应 JSON 数据结构为:{"animal": "pets"}

// 基本格式
animal: pets

# 数组

格式:一个数组,必须 连线符 左侧相同

// YAML,数组,表示:[ 'Cat', 'Dog', 'Goldfish' ]
- Cat
- Dog
- Goldfish


// YAML,嵌套数组,表示:[ [ 'Cat', 'Dog', 'Goldfish' ] ]
-
- Cat
- Dog
- Goldfish

# 纯量

纯量最基本、不可再分的值,主要有以下类型,基本与 json 相同:

  • 布尔值,true/false
  • 整数,示例:12
  • 浮点数,示例:12.30
  • Null,有三种表示方法(以下都表示{ parent: null }):
    • 使用波浪符号~表示,示例: parent: ~
    • 直接用 null,示例: parent: null
    • 空白也表示 null,示例: parent:
  • 时间,采用 iso8601 格式,示例:iso8601: 2001-12-14t21:59:43.10-05:00
  • 日期,采用 iso8601 格式的 年、月、日表示,示例:date: 1976-07-31
  • 字符串,字符串规则较多,下面详细介绍下
# 字符串

字符串主要有以下规则

  • 默认不需要用引号,示例:str: 这是一行字符串
  • 包含空格、特殊字符等,需要放在引号内,示例:str: '内容: 字符串'
  • 单引号、双引号效果一样
  • 单引号中有单引号,需要使用两个单引号转义,示例:str: 'labor''s day'
  • 换行,可以写成多行,从第二行开始,必须有一个 单空格 缩进,换行符会被转成为 空格,即最终无换行符
    • 使用 | 符号保留换行符,每行都会保留一个换行符
    • 使用 > 符号折叠换行,即 只保留最后一个换行符
  • 可插入 HTML 标记

示例:

# 默认不需要用引号
str: 这是一行字符串

# 包含空格、特殊字符等,需要放在引号内
str: '内容: 字符串'

# 单引号、双引号效果一样
str: "这是一行字符串"

# 单引号中有单引号,需要使用两个单引号转义
str: 'labor''s day'		# 表示 { str: 'labor\'s day' }

# 换行,可以多行写,从第二行开始,必须有个空格缩进,换行符被转换成 空格
# 表示:{ str: '这是一段 多行 字符串' }
str: 这是一段
  多行
  字符串

# 使用 | 符号保留换行符,每行都会保留一个换行符
# 使用 > 符号折叠换行,即 只保留最后一个换行符
# 表示:{ this: 'Foo\nBar\n', that: 'Foo Bar\n' }
this: |
  Foo
  Bar
that: >
  Foo
  Bar


# 可插入HTML标记
# 表示:{ message: '\n<p style="color: red">\n  段落\n</p>\n' }
message: |
  <p style="color: red">
    段落
  </p>


# 复合结构

对象、数组结合使用

# 表示:{ languages: [ 'Ruby', 'Perl' ], websites: { YAML: 'yaml.org' } }
languages:
  - Ruby
  - Perl
websites:
  YAML: yaml.org

# 其他

# 引用

锚点&和别名*,可以用来引用。三个符号配合使用:

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

示例:

# 建立锚点
defaults: &defaults
  adapter: postgres
  host: localhost

development:
  database: myapp_development
  # 使用锚点数据,合并到当前数据结构中
  <<: *defaults

test:
  database: myapp_test
  # 使用锚点数据,合并到当前数据结构中
  <<: *defaults

表示以下 json 结构:

{
  "defaults": {
    "adapter": "postgres",
    "host": "localhost"
  },
  "development": {
    "database": "myapp_development",
    "adapter": "postgres",
    "host": "localhost"
  },
  "test": {
    "database": "myapp_test",
    "adapter": "postgres",
    "host": "localhost"
  }
}

# 函数和正则表达式

JS-YAML 特有,可以把函数和正则表达式转为字符串

# 表示 { fn: 'function () { return 1 }', reg: '/test/' }
fn: function () { return 1 }
reg: /test/

# 参考资料

Last Updated: 8/11/2023, 5:17:52 PM