TOC

YAML

当我在好几个项目中看到 yaml 文件之后,我就开始去学习 yaml。当时我有点烦躁,为什么又有人吃饱没事做喜欢造轮子呢?JSON 已经这么完美了,为什么要让我们学一门新的标记语言,记更多无聊的语法?

但是,在采用 YAML 一段时间之后,我能理解这门语言为什么被设计出来了 —— JSON 在做数据交换时确实表现挺完美(折中了表达效率和可读性),但是如果是作为项目配置文件的时候,有着两个非常大的缺陷。

  1. JSON 不支持注释,而我们的配置文件是很有些注释需求的
  2. 字符串如果太长的时候(多行),JSON 就不那么可读了,看到 \n 就头疼

主要是第一个原因,毕竟配置文件中出现多行字符串的概率相比较而言要小得多。

不过,一看 YAML 官方的 Spec(v1.2),简直了,还有好多复杂的用法。我下面说的内容只是 YAML 语法的一小部分。

毫不夸张的说,我怀疑它的设计目标不是替代 JSON,而是想淘汰 XML。

相比较之下,JSON 的规范简直不要太简约。

如果不是因为 JSON 在做配置文件时的缺陷,谁会需要学习一种新的语言?用 YAML 交换数据?不能想象。

如果是用来做配置文件,YAML 太复杂了。即便我们不用这些复杂的语法,可复杂的存在,就会使我们的工作变得存在不确定性。

所以,我不看好 YAML。

基本语法

  1. 使用空格缩进表示层次(缩进几格不重要,同一层次的数据左对齐就行)
  2. 井号开头表示注释

简单类型

  1. 字符串
  2. 布尔值:true / false, True / False
  3. 整数
  4. 浮点数
  5. Null 用 ~ 表示,为甚这么设计?
  6. 时间 ISO 8601 格式, 例如: 2001-12-14
  7. 日期 ISO 8601 格式, 例如: 2001-12-14t21:59:43.10-05:00

说明:

  1. 数值类型允许使用科学计数法,可以使用下划线分割,可以使用八进制(0o76),十六进制(0xFF)表示

复合类型

  1. 数组
    a:
        - 1
        - 2
    b: [1, 2]
    c:
        -
            - 1
            - 2
        -
            - 3
            - 4
    
    1. 对象
    a:
        a1: 1
        a2: 2
    b: {b1: 1, b2: 2}
    

通过问号和冒号支持复杂对象,这种设计明显不是为了配置文件使用。

?
    - a
    - b
:
    - x
    - y

表示:["a", "b"]: ["x", "y"],可能数据交换场景中才会有这种需求。

其他

  1. --- 表示文档开始,... 表示文档结束,一个文件中可以有多个 YAML 文档。
  2. !!xxx 表示数据类型,比如 !!str 2021-10-01 就是指字符串 2021-10-01 而不是日期类型。
  3. 和 XML 很像的一点是,YAML 也可以导入命名空间,引入新的数据类型。
  4. YAML 内置类型好像都有 !! 表示,比如 !!str, !!int, !!seq, !!map, !!omap, !!bool, !!null, !!float
  5. !!binary + Base64 编码字符串表示二进制内容。
  6. 好像还有单个 ! 的语法...
  7. 还有很多指令...

参考资料与拓展阅读