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. 还有很多指令...

工具

  1. https://www.yamllint.com/
  2. https://yamlchecker.com/
  3. https://codebeautify.org/yaml-editor-online
  4. https://codebeautify.org/yaml-validator/

参考资料与拓展阅读

如果你有魔法,你可以看到一个评论框~