yaml 文件简介
YAML 是什么
简单来说, 一个用于表示格式化数据的文本文件.
同类的还有 xml, json, ini , plist等.
通常用于书写配置文件, 例如 Hexo 的配置文件就是 YAML 格式的. YAML 格式文件一般后缀是 yml
YAML 能做什么
能用于表达数组, 字典, 简单值.
例如这个 json 文件
1 | { |
如果使用 xml 那么可能是这样
1 |
|
如果使用 YAML 表达可以是这样
1 | string: hello, world |
YAML 的优点
文件尺寸小
这个看上面的例子就明白了, 丢掉了一大堆括号, 引号, 文件尺寸还是略微有减小的. 相比 xml 就很明显了.
不需要引号, 括号之类的边界符号
由于 YAML 的定位是编写配置文件, 而配置文件一般是人工编写的, 如果文件结构越简单, 那么编写起来就越容易, 当然也越不容易犯错..
相信编写过 xml 配置文件的同学深有体会.
层级结构, 易于阅读
xml, json 中的层级结构并不是必选的, 当被压缩过后, 缩短为一行, 往往需要使用工具将其格式化后才能阅读. 而 YAML 中基本上是强行缩进的(不是绝对的).
兼容json, 可以无缝迁移
如果你的旧有配置文件使用 json 格式, 那么如果要迁移到 YAML 时, 配置文件不做修改也可以正常使用, YAML 在实现上(1.2 版本), 将 json 作为一个子集来支持.
YAML 语法介绍
编码
YAML 使用UTF-8或是 UTF-16编码.
关于缩进
YAML 使用缩进表示层级关系, 注意, 不能使用 TAB 来缩进.
1 | parent: |
相当于
1 | { |
注释
不同于 json, YAML 支持注释, 注释以 # 开头
1 | # 这是注释 |
列表(数组, 清单…)
列表使用 -空格 表示 -
也可以使用json 的方括号方式 [obj1, obj2] 使用 逗号 隔开成员, 注意, 空格前后的字符串会被忽略, 如果需要指定有空格的字符, 用引号包起来.
1 | arr1: |
相当于
1 | { |
字典(哈希表, 散列表)
字典使用 冒号 空格: 隔开key 和value, 空格是必须的, 如果值不是一个基本数据, 则换行后, 使用空格缩进表示, 也可以使用json 方式, 使用{obj1: obj2}
1 | obj1: value1 |
相当于
1 | { |
有一点需要注意的是, YAML 中 key 是有顺序的. 例如, 这两个YAML 并不相等
1 | a: 123 |
1 | b: 456 |
基本数据
基本字符串
字符串可以直接书写, 不需要加上引号, 如果必, 例如要在字符串中使用引号, #符号, 也可以使用双引号或是单引号, 引号内部, 可以使用 \ 转义特殊字符
1 | key1: string |
相当于
1 | { |
多行文本
在需要使用多行文本的时候, 除了使用转义符外, 还有其他选择.
保存新行(Newlines preserved)符号 |
保存新行会保留每个换行符, 注意, 新行内容缩进不能小于第一行字符, 多出的缩进会被认为是空格.
1 | str: | |
相当与json 文件
1 | { |
渲染出来的结果
1 | line1 |
折叠新行(Newlines folded) >
与保留新行不同的是, 普通的折行不会保留为新行, 需要新行需要空一行才行
注意, 保持缩进一致, 否则可能会有意料之外的结果
1 | str: > |
相当与json 文件
1 | { |
渲染出来的结果
1 | line1, still line1 |
锚点及引用
当处理大量数据的时候, 往往有些数据是可以直接重复使用的, 或是经过简单修改就可以重复使用, 在其他语言结构中, 我们基本上只能靠手动复制粘贴, 不仅是繁琐, 也增加了错误的可能性.YAML 支持锚点和引用, 这样我们就可以方便的引用其他文件了.
使用 & 定义一个锚点, 相当于定义一个变量
使用 * 获取一个锚点, 相当取一个变量的值
使用 <<: *锚点 展开锚点, 相当于继承, 继承的节点可以覆盖同名的数据或是新增字段.
例如, 我们配置 3 个服务器节点
1 | api_server: |
相当于 json
1 | { |
强制类型制定
通常情况下, YAML 会自动推断类型, 某些情况下, 如果你需要强制制定数据的类型, 可以使用 类型制定来操作.
例如:
1 | a: 123 # int |
多个子YAML 段
你可以在一个文件中, 包含若干个独立的YAML, 使用 --- 区分就行了, 还可以使用... 来显示标识YAML 结束(可选), 这个特性可以用于网络通信中在不中断的链接的情况下, 完整的接收多个YAML 配置.
1 |
|