简体中文

开发者工具 · 语法转换器

JSON 到 YAML 转换的工作原理:引用、缩进和流程样式

· 工作原理

json yaml 开发人员工作流程

嵌套 JSON 对象更改为缩进的 YAML 服务定义
原始 ToolAcre 矢量图

JSON 到 YAML 看起来像是删除大括号的问题,但转换器会真正决定哪些字符串需要引号以及何时使用块与流样式。这篇文章将详细介绍这些决定。

大括号消失了,但是引号去了哪里? — 转换为 YAML 的 JSON 有效负载以及结果中引用字符串和裸字符串的混合

删除大括号和引号不会使 JSON 对象成为值得信赖的 YAML 文件。转换器必须决定如何表示嵌套映射、数组、字符串和换行符,以及看起来像数字或布尔值的值是否保留为文本。将 API 服务定义移动到 Compose 的 DevOps 工程师需要在将结果复制到部署目录之前可以预测这些决策。转换更改语法,而不是服务的实际配置。

JSON (几乎)已经是 YAML — 为什么在转换开始之前输入是有效的 YAML 1.2 流样式

YAML 1.2 将 JSON 语法视为普通 JSON 形数据允许的流式子集,这解释了为什么 JSON 对象已经接近 YAML。但有用的转换通常会切换为人类可读的块样式缩进。输入首先被解析为 JSON ;任意 shell 命令永远不会被执行。 ToolAcre 通过反向路径上的受限模式加载 YAML,拒绝不安全标签并限制别名扩展,因此转换器不能用于从不受信任的 !!js/function 标签实例化任意对象。

块样式与流样式 - 转换器如何选择基于缩进的映射和序列而不是大括号和方括号,以及缩进深度的含义

块样式使用缩进的键/值对和以破折号开头的行作为数组项:services.web 下的图像字符串在 web 下方缩进,而 ports 则成为序列。流样式保留类似 JSON 的大括号和中括号。 ToolAcre 使用默认两空格缩进的 js-yaml 转储,没有引用和无限的行宽设置,而不是仅仅用正则表达式替换标点符号。更改缩进宽度会影响可读性,而不是实际的键或数组顺序。

哪些字符串必须保留引号 - 否则将变成布尔值、数字、空值或日期的值,以及带有冒号、散列或前导空格的字符串

某些字符串必须加引号才能在另一个解析器中生存:“false”应保留文本而不是布尔值 false,“2026-09-28”不应默默地成为 YAML 1.1 使用者中的日期,冒号后跟空格可能会被误认为是映射语法。 ToolAcre 的转储程序选择保护性引号,包括旧版 YAML 阅读器的兼容性选择。并不总是需要用冒号引用普通图像引用,并且无缘无故地删除存在的引号可能会中断往返。验证类型以及视觉外观。

多行字符串 — JSON 字符串中的换行符如何成为文字 (|) 或折叠 (>) 块标量

包含实际换行符的 JSON 字符串可以使用 | 呈现为 YAML 块标量。 |- 形式会去除最后的换行符,而 |保留它; > 会将一些换行符折叠成空格。这些指标描述数据,而不是格式化装饰。 ToolAcre 的转储器选择一种可以读回原始字符串的表示形式,而不是总是强制使用一种样式。转换后,仔细检查多行环境值或证书:此处的缩进错误可能会更改应用程序收到的内容。

工作示例:将服务定义(嵌套的 JSON 对象)转换为 YAML,并注释每个引用和样式决策

对于具体的 JSON 对象,请将 services.web 与图像“example/web:1”、端口 [“8080:80”] 和环境键 DEBUG="false"、RELEASE="2026-09-28" 和 MESSAGE="line one\nline Two" 一起使用。 ToolAcre 发出图像:example/web:1 和端口列表; DEBUG 变为带引号的“false”,RELEASE 变为带引号的“2026-09-28”,MESSAGE 使用带有两行缩进的 |- 块。每个选择都会保护原始类型。在保存为 compose.yaml 之前运行面板的往返检查;转换器无法判断图像是否存在或服务是否将启动。

这不包括添加注释、锚点或自定义键顺序,这些内容都不存在于要继承的 JSON 源中

JSON 没有要保留的注释、锚点或别名:转换器无法从从未包含它们的输入中恢复它们。它还无法推断 Compose 特定的秘密管理、自定义密钥顺序或 Kubernetes API 版本有效性。两个 YAML 文件可以序列化相同的数据,但使用不同的空格和引号样式。检查目标程序中的结果,并避免将真实的 API 令牌粘贴到外部转换服务中。

要点:转换是使用规则的重新序列化 - 以及语法转换器面板如何在浏览器中生成 YAML

转换是在一组规则下解析和重新序列化,而不是删除标点符号。语法转换器在您的浏览器中执行这些操作;在将该方法应用于较大的文件之前,在本地检查敏感配置并在小型测试对象上运行往返。如果引用的值在返回时更改类型,则格式不仅仅是装饰性的,而且需要进行调查。