YamlBox

YAML 工具 · 5 分钟阅读

JSON 至 YAML:使机器输出再次可读

JSON在线上表现出色,但在拉动请求中却令人不快。当 API 响应、Terraform 状态片段或包清单必须成为人工逐行审查的内容时,通常的答案是 JSON 到 YAML 转换,以及该转换如何引用和缩进的详细信息决定结果在六个月后是否保持可读。

已更新

为什么要将 JSON 转换为 YAML

这两种格式保存相同的数据,但它们针对不同的读者进行了优化。 JSON 将字符放在大括号、逗号和引号上; YAML 将它们花在眼睛可以跟踪的结构上(作为缩进)。对于程序生成和使用的数据,JSON 获胜。对于个人编辑的数据 - Helm 值、CI 定义、Ansible 库存、Docker 撰写文件 - YAML 胜出,这就是为什么每当生成的数据需要人类所有者时就会出现这个方向。

评论是无法生存的一件事

转换可以恢复可读性,但无法恢复意图:源 JSON 没有任何注释可以保留。如果您生成的 YAML 将由人们维护,请添加一个简短的标题注释来描述它的来源以及重新生成它的内容,这样就没有人会编辑将在下次部署时被覆盖的文件。

引用:转换后的 YAML 悄然断裂

YAML 将几个裸词视为值而不是字符串。积极删除引号的转换器可以更改类型而不更改单个可见字符:

                country: NO        # parses as boolean false in YAML 1.1
version: 1.10      # parses as the number 1.1
time: 22:30        # parses as a sexagesimal integer
name: "on"         # quoted on purpose — must stay a string
              

好的输出会引用任何可能被误读的字符串 - `yes`/`no`/`on`/`off`、看起来像数字的标识符、带前导零的值、时间和日期 - 而不是引用所有内容,这会产生你试图逃避的标点符号墙。

缩进和多行字符串

两个空格是安全的默认值:这是 Kubernetes 文档、Helm 模板和大多数编辑器所假设的,并且它可以在工具之间复制粘贴。四空间风格的深度嵌套很难浏览超过六层。长字符串是另一种格式化决策 - 嵌入换行符的 JSON 值可以作为转义单行符或自然读取的 YAML 块标量出现。如果该字段是 shell 脚本或配置片段,请要求块形式。

对键进行排序使差异变得有意义

JSON 对象键顺序并不重要,因此转换器可以自由地重新排序。按字母顺序对键进行排序可以使重新生成的文件清晰地进行区分:如果没有它,更改的部署顺序将显示为整个文件重写。如果您在 git 中跟踪生成的 YAML,排序就是一行差异和两百行差异之间的区别。

将往返行程保留在一个地方

由于这两个方向是相反的,因此值得将这两个方向放在同一个工具中,这样您就可以进行转换、编辑和转换回来,而无需切换上下文或将配置粘贴到三个不同的服务中。该站点上基于浏览器的转换器与 YAML 到 JSON 工具配对,离线工作,并且从不上传有效负载 - 当所讨论的 JSON 是生产 API 响应时,这一点很重要。

JSON 至 YAML — 常见问题

转换后的 YAML 会保留我的密钥顺序吗?

转换器可以对键进行排序或保留插入顺序。对于 git 中跟踪的文件来说,排序通常是更好的选择,因为重新生成会产生稳定、最小的差异;当顺序本身对读者有意义时,保留原始顺序。

为什么值在 JSON 到 YAML 转换后类型发生变化?

YAML中的裸标量被重新解释:`no`、`on`和`off`可以变成布尔值,像`1.10`这样的值可以变成数字。安全的转换器会引用字符串,否则会被误读。如果某个字段必须保留为字符串,请在 YAML 中明确引用它。

我可以离线将 JSON 转换为 YAML 吗?

是的 - 转换是本地解析和重新序列化,不涉及服务器,因此该工具可以在网络断开的情况下继续工作,并且您的数据永远不会离开浏览器选项卡。

这篇文章中提到的工具

浏览 19 工具的完整列表

更多文章可供阅读

6 分钟阅读

YAML 至 JSON:轻松转换配置

通过多文档支持和准确的错误位置,在浏览器中将 YAML 转换为 JSON - 以及悄悄破坏 CI 管道的 YAML 错误。

所有19帖子→