当我在好几个项目中看到 yaml 文件之后,我就开始去学习 yaml。当时我有点烦躁,为什么又有人吃饱没事做喜欢造轮子呢?JSON 已经这么完美了,为什么要让我们学一门新的标记语言,记更多无聊的语法?
但是,在采用 YAML 一段时间之后,我能理解这门语言为什么被设计出来了 —— JSON 在做数据交换时确实表现挺完美(折中了表达效率和可读性),但是如果是作为项目配置文件的时候,有着两个非常大的缺陷。
- JSON 不支持注释,而我们的配置文件是很有些注释需求的
- 字符串如果太长的时候(多行),JSON 就不那么可读了,看到
\n
就头疼
主要是第一个原因,毕竟配置文件中出现多行字符串的概率相比较而言要小得多。
不过,一看 YAML 官方的 Spec(v1.2),简直了,还有好多复杂的用法。绝大多数人使用的 YAML 只是其语法的一小部分。
毫不夸张的说,我怀疑它的设计目标不是替代 JSON,而是想淘汰 XML。
相比较之下,JSON 的规范简直不要太简约。
如果不是因为 JSON 在做配置文件时的缺陷,谁会需要学习一种新的语言?用 YAML 交换数据?不能想象。
如果是用来做配置文件,YAML 太复杂了。即使我们不用这些复杂语法,我觉得还是不要引入这些不必要的不确定性,不在我们控制能力之内的东西尽量少碰。
所以,我不看好 YAML。
基本语法
- 使用空格缩进表示层次(缩进几格不重要,同一层次的数据左对齐就行)
- 井号开头表示注释
简单类型
- 字符串
- 布尔值:true / false, True / False
- 整数
- 浮点数
- Null 用 ~ 表示,为甚这么设计?
- 时间 ISO 8601 格式, 例如:
2001-12-14
- 日期 ISO 8601 格式, 例如:
2001-12-14t21:59:43.10-05:00
说明:
- 数值类型允许使用科学计数法,可以使用下划线分割,可以使用八进制(0o76),十六进制(0xFF)表示
复合类型
- 数组
1. 对象a: - 1 - 2 b: [1, 2] c: - - 1 - 2 - - 3 - 4
a: a1: 1 a2: 2 b: { b1: 1, b2: 2 }
通过问号和冒号支持复杂对象,这种设计明显不是为了配置文件使用。
? - a
- b
: - x
- y
表示:["a", "b"]: ["x", "y"]
,可能数据交换场景中才会有这种需求。
其他
---
表示文档开始,...
表示文档结束,一个文件中可以有多个 YAML 文档。!!xxx
表示数据类型,比如!!str 2021-10-01
就是指字符串2021-10-01
而不是日期类型。- 和 XML 很像的一点是,YAML 也可以导入命名空间,引入新的数据类型。
- YAML 内置类型好像都有
!!
表示,比如!!str
,!!int
,!!seq
,!!map
,!!omap
,!!bool
,!!null
,!!float
!!binary
+ Base64 编码字符串表示二进制内容。- 好像还有单个
!
的语法... - 还有很多指令...
工具
- https://www.yamllint.com/
- https://yamlchecker.com/
- https://codebeautify.org/yaml-editor-online
- https://codebeautify.org/yaml-validator/
参考资料与拓展阅读
- yaml.org, YAML Ain’t Markup Language (YAML™) Version 1.2
- 阮一峰,YAML 语言教程
- ECMA, ECMA-404_2nd_edition_december_2017.pdf
- 微信公众号, DeepNoMind, 五分钟搞定 YAML