Command Palette

Search for a command to run...

YAML 到 JSON:在不丢失数据的情况下转换清单、编写文件和管道

YAML 到 JSON:在不丢失数据的情况下转换清单、编写文件和管道

T
Toolz Team
|Aug 23, 2026|17 最小读数

数据工具 合集的一部分

Helm value文件, 去年我花了一个下午调试同事发誓没错, 每个键看起来都对, 服务拒绝启动, 罪魁祸首竟然是四个字: NO 作为区域列表中的国家/地区代码(未引用)。 YAML 解析器将其读作布尔值 false,渲染的模板 false into header,并且请求在下游被拒绝,错误消息既没有提到 YAML 也没有提到挪威。那个错误足够有名,可以有一个名字 - 挪威问题 - 而且它只是一系列惊喜中的一种,以我们大多数人视为 "JSON 的格式等待,具有更好的空白。"

TL;博士:YAML 到 JSON 转换器 YAML文档解析并打印等效的JSON,沿途解析锚、别名、合并键和块标量将您的配置视为JSON,可以准确地显示解析器决定您的值的含义 - 它推断出哪些类型,扩展了哪些引用 - 在该解释到达集群之前,它完全在您的浏览器中运行。

YAML转换为JSON不仅是一种格式更改,它是对您的配置实际包含的内容进行最快的可用审计。JSON没有注释,没有锚点,没有超出语法直接陈述的内容的隐式类型,因此清单的JSON视图是其已解决的、明确的版本。本指南涵盖了YAML如何映射到JSON上,导致真实事件的类型和引用行为,以及当您调试配置、针对清单编写脚本或编写测试夹具时如何使用转换器。

YAML 转换为 JSON 实际上是做什么的?

关系是定义的,而不是偶然的: YAML 1.2 规范 声明 YAML 是 JSON 的超集,因此每个 JSON 文档都已经是有效的 YAML。YAML 和 JSON 描述了相同的三件事:键到值的映射、有序序列和标量。转换行走 YAML 文档并发出其 JSON 等效项中的每个构造。块映射成为对象。块序列成为数组。标量变成字符串、数字、布尔或空,具体取决于 YAML 核心架构如何解析它。

结构部分无趣,因为它是机械的,有趣的部分是YAML能表达的JSON不能的一切,因为那是转换器必须代表你做出决定的地方:

YAML 功能 JSON 得到什么 为什么这很重要
评论(# ...) 掉落 JSON 没有注释语法;您的配置中的文档无法保存
锚和别名(&base*base) 扩展副本 JSON 没有引用语法,所以共享块是重复的
合并键 (<<: *base) 压扁成物体 根据合并密钥规范,显式密钥覆盖合并密钥
块标量(` , &gt;`) 一个带有转义的字符串
多份文件(---) 一系列文档 Kubernetes 丛变成 JSON 数组,每个资源一个元素
隐式打字 已解决的类型 未引用 8080 成一个数字, true 一个布尔, null 一个空

最后一行是值得盯着看的,JSON 强制每个值通过语法声明其类型:引号表示字符串,裸数字表示数字 YAML 从文本的形状推断类型,转换为 JSON 使推理可见,如果您期望有版本字符串,JSON 会向您显示 1.1 YAML 说的话 1.10,你发现了一个本来可以发货的错误。

YAML&#39;s隐式打字为什么会造成真正的中断

YAML 1.2核心模式,以模式解析一个未引用的标量,数字变成整数,小数点或指数的数字变成浮点数。 truefalse 成为布尔人。 null~ become null。其他一切都是一根字符串。

这听起来很整洁,直到您满足看起来像一种类型并且意味着另一种类型的值:

  • 端口和 ID。 port: 08080 8080这个数字不是,一个前导零使得它在核心模式下是一个无效的整数,所以大多数解析器把字符串交回去,一些较旧的则把它解释为八进制,前导零的邮政编码、电话号码、账户ID都有同样的问题。
  • 版本。 version: 1.10 是浮子 1.1。尾随零已消失,没有解析器警告您。将此与容器标签进行比较,查找失败。
  • 国家和语言代码。 YAML 1.1下- 默认情况下PyYAML仍然遵循该规定,以及许多Ruby和较旧的Java工具- ynyesnoon、和 off 是布尔人。 NOON、和 NA 是现实世界中完全普通的两个字母代码。
  • 时代和六十进制。 YAML 1.1 也解析 12:30 60进制数,也就是750,类似克朗或类似持续时间的字符串可以消失成整数。

这些都是静音数据损坏,不是解析错误,文档有效,流水线绿色,值错误,转换器&#39;s 保持弦乐 option 恰好是针对这类调查而存在的:打开它,每个普通标量都以字符串的形式返回,因此您可以并排比较两个转换,并准确地看到解析器正在重新解释哪些值。无论 JSON 显示什么,没有该选项,您的生产解析器今天最有可能做什么。

源YAML中的修复总是相同的:引用任何意义是文本的东西。 port: "8080"version: "1.10"region: "NO"。引号不花钱,把整个类别的bug都去掉,如果你从JSON生成YAML而不是写出来,the JSON 到 YAML 转换器 自动应用该报价来表示模糊值。

锚、别名和合并键如何转换

主播是YAML&#39;对重复的回答。您用标记节点 &name之后再参考 *name:

defaults: &defaults
  restartPolicy: Always
  terminationGracePeriodSeconds: 30

web:
  <<: *defaults
  replicas: 3

worker:
  <<: *defaults
  terminationGracePeriodSeconds: 120

JSON没办法说&quot;和那边一样的值。&quot;所以转换器把每个引用都扩展成一个完整的副本,上面的输出变成三个对象,每个对象都带有自己的 restartPolicy的,而且JSON比产生它的YAML还要长,那不是转换中的缺陷- 就是YAML的意思,写出来。

的合并密钥 << deserves its own note,因为它的优先规则很容易倒退,在子映射中显式写入的键战胜合并拉入的键,在例子中, worker 120的宽限期结束,而不是30,无论合并线出现在显式密钥的上方还是下方,转换器实现了该规则,因此JSON向您展示了有效的,合并后的配置- 这通常是您实际想要检查的内容。

由此可见两个实际用途:首先,当配置使用重锚定时,转换为 JSON 是回答 &quot;此环境实际上解析为什么?&quot;而不运行部署的最快方法。其次,如果别名没有匹配的锚 - 将一个大文件分成几个文件的常见结果 - 转换器将其报告为行号错误,而不是默默地生成空。

块标量如何转换

YAML 有两种嵌入多行文本的方法, 它们的行为方式不同:

  • 字面意思(|) 保持每个换行符完全按照写入的方式。将其用于 shell 脚本、PEM 证书、SQL 以及任何对空格敏感的内容。
  • 折叠(>) joins 连续行 单空格 把空行当段落break 用它做你想包在源文件里,却加入值的散文。

Both都接受控制尾随换行符的重击指示符,默认的称为剪切,恰好保留一个尾随换行符。A 减 (|-) 剥离所有尾随换行符。A加(|+)保留其中的每一个。

在 JSON 中,所有这些都折叠成一个字符串 \n escapes。那是 JSON 视图有用的另一个原因:它是明确的。A | 最后一行意外缩进的块,或 > block 就是你要保持分离的折叠连接的两条线,在 JSON 中是显而易见的,在 YAML 中几乎是看不见的。转换器还处理捕获幼稚实现的情况 - a # 字面块中的字符是内容,而不是评论,当您嵌入以 shebang 开头的 shell 脚本时,这很重要。

如何使用 YAML 到 JSON 转换器

1步:粘贴文档

将任何 YAML 粘贴到输入面板中:Kubernetes 清单,a docker-compose.yml、github Actions 工作流程、Ansible 手册、 .gitlab-ci.yml的,或者一个应用程序配置。多文档文件与 --- 分隔符很好 - 每个文档都是独立解析的。点击 加载样品 从一个现实的部署开始,该部署练习嵌套地图、序列、空集合和字面块标量。

不会解析的一件事是带有选项卡字符的缩进。YAML 直接禁止选项卡,转换器用违规的行号而不是猜测来这么说。在 Enter 上插入选项卡的编辑器是通常的来源;大多数都有一个 &quot;将缩进转换为空格 &quot; 命令,可同时修复整个文件。

2步:选择输出形状

2 个空格4 个空间、或者 精简. 缩小是你要将结果粘贴到 a 中时所要的 curl body 或环境变量。缩进输出是当人类必须阅读它时你想要的。

排序键 every levels上按字母顺序重写对象键,这在比较一个config的两个版本时是非常宝贵的:两个文件仅在键顺序上不同,会产生相同的排序JSON,因此一个diff只显示真正的变化,将两个输出都馈送到 JSON 迪夫 工具,您可以获得精确的结构比较,而不是逐行比较。

保持弦乐 disables 标量强制,如上所述,当你想看到每个值的原始文本时,或者下游消费者无论如何都把所有内容都当成字符串时,使用它。

3步:转换并读取错误

单击 。如果文档格式良好,JSON 会与行计数、密钥计数、字节大小以及 - 对于多文档流 - 找到多少个文档一起显示在下面。

如果格式不正确,错误会命名该行。消息涵盖了实践中实际发生的故障:用于缩进的选项卡、与其兄弟姐妹不一致缩进的行、未终止的引用字符串、没有锚的别名、指向非映射的合并键。行号将五分钟的狩猎变成五秒的修复。

4步:复制、下载或继续进行

将 JSON 复制到剪贴板或将其下载为 .json 文件。从那里开始,常见的后续步骤是漂亮的打印和验证 json格式化程序为配置加载器生成类型 json 打字稿或者与以下机构签订 CI 验证合同 JSON 模式生成器

这符合实际的工作流程

调试一个清单,&quot;看起来不错&quot;

Deployment 行为出乎意料,YAML 读取正确时,转换它。JSON 在十分之九的情况下立即显示问题:一个值变成布尔值,一个嵌套键因为杂散空间而比预期浅一级,一个锚扩展到陈旧的 JSON 视图,消除了使错误不可见的空白歧义。

根据配置编写脚本

Shell 和 Node 脚本原生处理 JSON;YAML 需要依赖,当我需要从一捆清单中拉出每个图像标签时,先转换为 JSON 并通过管道 jq yaml库添加到一次性脚本中要快,这里的转换器&#39;s多文档支持很重要- 一个由六个资源组成的kubernetes捆绑包变成了一个你可以迭代的json数组。

建筑测试夹具

Integration tests 往往需要一个配置对象而不是一个配置文件,将真实清单转换为 JSON 给你一个固定装置,保证与生产形状相匹配,这比你从内存中输入的对象要好得多,是一个起点,可以与它配对 json 打字稿 您的固定装置附带类型。

查看拉取请求中的配置

重锚 YAML 的差异很难阅读,因为一行更改为锚会默默地改变每个消费者。将两个版本转换为 排序键 启用和修改 JSON 会显示真实的爆炸半径:每个已更改的解析值,而不仅仅是已编辑的行。

在工具之间迁移

很多平台接受 JSON 但不接受 YAML,反之亦然。转换通常是整个迁移。当您需要反向返回时 - JSON 在手,YAML 需要 - JSON 到 YAML 转换器 关闭循环,然后 YAML 验证器 在提交结果之前确认结果解析。

YAML 和 JSON 进行了比较

尺寸 山药 JSON
评论 是的
人类编辑 基于压痕,易于撇去 标点符号重,冗长
机器解析 更慢、更大的解析器、更边缘的案例 到处都是快速、微小的解析器
类型推断 隐式、模式相关 从语法显式
参考文献 锚、别名、合并键 没有
每个文件有多个文档 是的,通过 ---
典型的家 配置文件、CI 管道、清单 API、数据交换、存储

YAML 1.2在形式上是JSON的超集,所以每个JSON文档都已经是有效的YAML,反之则不然,这就是为什么将YAML转换为JSON是一个有损操作,恰好在一个方向上:丢弃注释和引用结构,而保留数据,如果你的YAML有你关心的注释,就把YAML作为真理的来源,把JSON当作派生神器。

隐私:为什么这会在您的浏览器中运行

Config文件是团队拥有的最敏感的纯文本工件之一,它们带有内部主机名,集群名称,注册表路径,服务帐户,数据库标识符,以及 - 尽管每个人&#39;的最佳意图 - 偶尔还没有成为秘密管理器的凭据。

Converter 是客户端的 JavaScript,你的文档在页面中解析,JSON 在页面中产生,没有任何请求将你的数据携带到任何地方,加载一次工具,它会一直关闭网络,这是你粘贴清单的任何东西的合理习惯,这是站点上每个工具背后的相同原理,推理在指南中拼写出来 在线工具中的数据隐私。如果您正在组装通用浏览器工具包,则 web开发人员工具包 指南涵盖了其中还包含哪些内容。

值得了解的限制

适合浏览器选项卡的转换器无法实现 YAML 规范的每个角落,并且具体说明边缘比暗示没有更有用。

复杂的映射键 - 显式 ? key form where the key is itself a sequence or mapping - are not supported, because JSON object keys must be string。type tags as !!binary 或定制 !MyType directives 不解释;值以文本形式传入。特殊的浮点值 .inf-.inf、和 .nan 以字符串的形式保留,因为 JSON 没有字面意思,而是默默地转换为 null 会失去的信息多于它所保存的信息。指令,例如 %YAML 1.2 被忽视而不是采取行动。

这些都没有出现在普通的 Kubernetes、Compose、Actions 或 Ansible 文件中。如果您点击了其中一个,您正在使用为特定语言编写的文档&#39;s YAML 库,而该库&#39;自己的自卸程序是正确的工具。

常问问题

如何在线将yaml转换为json?

将 YAML 粘贴到输入面板中,然后单击转换。 解析器读取文档、解析锚点和块标量,并打印格式化的 JSON,您可以复制或下载。 一切都发生在您的浏览器中,因此没有上传文件。

JSON 是 YAML 的子集吗?

是的。 YAML 1.2 被重新定义为 JSON 的严格超集,因此任何有效的 JSON 文档也是有效的 YAML。 反过来不是真的:YAML 添加注释、锚点、块标量、每个文件的多个文档和非字符串键,这些都没有 JSON 可以直接表达。

YAML 锚和别名如何转换为 JSON?

JSON 没有引用语法,因此每个别名都扩展成其锚定义的值的完整副本,重复使用默认块三次的配置会产生三个相同的 JSON 对象,因此输出大于 YAML 源,但语义相同。

合并双角支架等键会发生什么?

引用的映射合并到当前对象中。 在子映射中明确写入的键 胜过合并的键,这与 YAML 合并密钥规范和 Kubernetes 和 Ansible 工具的行为相匹配。

为什么我的 YAML 出现选项卡错误而失败?

YAML 禁止缩进的选项卡字符- 规范只允许空格,在 Enter 上插入选项卡的编辑器是通常的原因,将前导选项卡转换为空格,大多数编辑器可以一次为整个文件完成,文档将解析。

我可以转换带有文档分隔符的多文档 YAML 文件吗?

是。分隔符标记之间的每个文档都是独立解析的,结果是一个每个文档一个元素的JSON数组,按源顺序。单个文档文件返回对象本身,而不是一个单元素数组。

端口号和版本字符串会保留其类型吗?

普通标量由 YAML 核心模式解析,因此未引用的 8080 变为数字 8080,未引用的 1.10 变为 1.1。引用 YAML 中的值以将其保留为字符串,或打开保留字符串选项以关闭所有标量强制。

字面标量和折叠块标量如何转换?

字面块保留每条换行符,因此它成为具有转义换行的 JSON 字符串。折叠块将连续的行与空格连接,并将空行视为段落空行。尊重咀嚼指标:减去尾随换行符,加号保留每条尾随空行符。


Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!