YamlBox

指南文章·阅读 6 分钟

YAML 与 JSON:何时使用哪个

YAML 与 JSON 是基于相同基本思想的两种序列化格式之间的选择:嵌套键值对和列表。实践中重要的区别在于谁读取文件:人类还是机器。

已更新

YAML 与 JSON:简短版本

JSON是一种数据交换格式:严格、明确,并且每种语言都可以本地解析它。 YAML 是一种配置格式:它接受注释和多行字符串,并且旨在由拉取请求中的人员进行编辑。在网络上使用 JSON,在人类维护的文件中使用 YAML - 并在边界需要时在它们之间进行转换。

实际上有什么不同

评论

YAML 有评论; JSON 没有。在配置文件中,这是决定性的——您知道为什么超时设置为 3000 的原因通常是上面的注释。当您将 YAML 转换为 JSON 时,注释将被删除,这就是为什么 JSON 通常被视为构建工件,而不是事实来源。

语法和噪音

                # YAML
service:
  name: checkout
  replicas: 3
  ports: [8080, 9090]

// JSON — same data
{
  "service": {
    "name": "checkout",
    "replicas": 3,
    "ports": [8080, 9090]
  }
}
              

YAML 删除大括号、引号和逗号以换取缩进敏感性。这是每个 1 用户都知道的交易:字符越少,出现空格错误的方法就越多。

类型和陷阱

  • JSON 有一种数字类型; YAML 区分整型、浮点型等,而 YAML 1.1 著名地将国家代码 NO 解析为布尔值 false,而 1.10 解析为一个数字,除非引用,否则会丢失尾随零。
  • YAML 支持锚点和别名(&defaults / *defaults)以供重用; JSON没有等价物,因此必须复制或生成共享块。
  • YAML 支持多文档文件(---分隔符); JSON 是每个文件一个文档。转换器通常将文档转换为数组。
  • JSON 需要双引号键和字符串; YAML 仅在必要时才使用引号,这意味着粗心的字符串可能会默默地变成数字或布尔值。

每种格式获胜的地方

  • API 和有线格式:JSON。通用解析器、可预测的歧义、流友好(JSON行)。
  • Kubernetes、CI/CD、Docker Compose、Ansible、Helm:YAML,因为这些生态系统对其进行了标准化并支持评论。
  • 您以编程方式生成的供应商配置:JSON — 算法生成它而无需担心缩进。
  • 初级队友将手动编辑的文档:YAML,并附有解释原因的注释。

安全转换

  1. 了解您的多文档文件。由 --- 分隔的 k8s 清单集必须成为 JSON 数组,而不仅仅是第一个文档。使用报告它找到的文档数量的转换器。
  2. 引用作为标识符的数字。 “1.10”是一个版本; 1.10 是一个浮点数。如果值是看起来数字的字符串,则在转换为 YAML 时启用强制引号。
  3. 看着评论消失。根据定义,转换为 JSON 是有损的;如果注释很重要,请保留 YAML 作为源并仅在构建时生成 JSON。
  4. 验证精确的错误。缩进错误在某些工具中会产生误导性消息;确保你的显示行和列。

尝试一下:将任意 YAML 粘贴到 YAML 到 JSON 转换器中 — 内置多文档支持和精确的错误行,并且不会上传任何内容。

常见问题

YAML是JSON的超集吗?

YAML 1.2 被设计为超集——有效的JSON 通常也是有效的YAML。但YAML 1.1(仍然存在)在某些边缘情况下有所不同,并且制表符、重复键和某些字符串在不同引擎中的解析方式不同。将“它在技术上有效YAML”视为一个有趣的事实,而不是迁移策略。

哪个解析速度更快?

JSON 解析器通常更快、更简单,因为语法更小;每个运行时都存在本机 JSON 解析。对于配置文件来说,差异是无关紧要的——您在启动时解析一次。