将 YAML 转为 JSON(并避免缩进错误)

自 YAML 1.2 起,任何 JSON 文档都是合法的 YAML。将 YAML 配置转为 JSON,并留意缩进与类型推断陷阱。

YAML 与 JSON 是相关的

YAML 1.2 是 JSON 的严格超集,因此任何 JSON 文档本身就是合法的 YAML。把 YAML 转换为 JSON,主要是把基于缩进的结构改写成花括号和方括号。

缩进规则

YAML 不允许用 tab 缩进 —— 必须用空格,并让同级键保持相同的深度。意外的 tab 或缩进错位是最常见的 YAML 解析错误。

挪威问题

未加引号的 NO、yes、on、off 在某些解析器中会被读成布尔值,于是国家代码 NO 就变成了 false。给这些值加引号,强制它们保持字符串。

安全地转换

先校验 YAML,再转换。给有歧义的标量加引号,并确认数字、日期、前导零的值仍然是你期望的类型。

多文档 YAML 流

一个 YAML 文件可以用 '---' 分隔多个文档。JSON 没有对应概念 —— 单独转换每一个文档,如果下游工具需要一次拿到全部,就把它们包成一个 JSON 数组。Kubernetes manifest 是最常见的场景。

Anchor 与 alias

YAML 的 & anchor 与 * alias 允许通过引用复用节点,但 JSON 没有别名机制。安全的转换器会把每个 alias 解析为锚定值的一份拷贝,这会让文档膨胀。请注意,再转回 YAML 会丢失原本的共享关系。

YAML 转换时会丢失的信息

注释、!!binary 这样的标签注解、自定义 tag、block 与 flow 风格的区别以及键序,在 YAML 转 JSON 时都会被丢弃。对纯数据交换来说没问题;但对人工编辑的配置文件,应把 YAML 当作真正的源文件。