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/
# 参考资料
- YAML 官网 (opens new window)
- YAML 语言教程- (opens new window)阮一峰 (opens new window)
- js-yaml (opens new window)
- JS-YAML demo (opens new window),YAML JavaScript parser,可以使用该网页参看所有语法规则,并且可以翻译 YAML 成对应 JSON 结构,,很重要的一个网站