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) |
压扁成物体 | 根据合并密钥规范,显式密钥覆盖合并密钥 |
| 块标量(` | , >`) |
一个带有转义的字符串 |
多份文件(---) |
一系列文档 | Kubernetes 丛变成 JSON 数组,每个资源一个元素 |
| 隐式打字 | 已解决的类型 | 未引用 8080 成一个数字, true 一个布尔, null 一个空 |
最后一行是值得盯着看的,JSON 强制每个值通过语法声明其类型:引号表示字符串,裸数字表示数字 YAML 从文本的形状推断类型,转换为 JSON 使推理可见,如果您期望有版本字符串,JSON 会向您显示 1.1 YAML 说的话 1.10,你发现了一个本来可以发货的错误。
YAML's隐式打字为什么会造成真正的中断
YAML 1.2核心模式,以模式解析一个未引用的标量,数字变成整数,小数点或指数的数字变成浮点数。 true 並 false 成为布尔人。 null 並 ~ become null。其他一切都是一根字符串。
这听起来很整洁,直到您满足看起来像一种类型并且意味着另一种类型的值:
- 端口和 ID。
port: 080808080这个数字不是,一个前导零使得它在核心模式下是一个无效的整数,所以大多数解析器把字符串交回去,一些较旧的则把它解释为八进制,前导零的邮政编码、电话号码、账户ID都有同样的问题。 - 版本。
version: 1.10是浮子1.1。尾随零已消失,没有解析器警告您。将此与容器标签进行比较,查找失败。 - 国家和语言代码。 YAML 1.1下- 默认情况下PyYAML仍然遵循该规定,以及许多Ruby和较旧的Java工具-
y、n、yes、no、on、和off是布尔人。NO、ON、和NA是现实世界中完全普通的两个字母代码。 - 时代和六十进制。 YAML 1.1 也解析
12:3060进制数,也就是750,类似克朗或类似持续时间的字符串可以消失成整数。
这些都是静音数据损坏,不是解析错误,文档有效,流水线绿色,值错误,转换器's 保持弦乐 option 恰好是针对这类调查而存在的:打开它,每个普通标量都以字符串的形式返回,因此您可以并排比较两个转换,并准确地看到解析器正在重新解释哪些值。无论 JSON 显示什么,没有该选项,您的生产解析器今天最有可能做什么。
源YAML中的修复总是相同的:引用任何意义是文本的东西。 port: "8080"、 version: "1.10"、 region: "NO"。引号不花钱,把整个类别的bug都去掉,如果你从JSON生成YAML而不是写出来,the JSON 到 YAML 转换器 自动应用该报价来表示模糊值。
锚、别名和合并键如何转换
主播是YAML'对重复的回答。您用标记节点 &name之后再参考 *name:
defaults: &defaults
restartPolicy: Always
terminationGracePeriodSeconds: 30
web:
<<: *defaults
replicas: 3
worker:
<<: *defaults
terminationGracePeriodSeconds: 120
JSON没办法说"和那边一样的值。"所以转换器把每个引用都扩展成一个完整的副本,上面的输出变成三个对象,每个对象都带有自己的 restartPolicy的,而且JSON比产生它的YAML还要长,那不是转换中的缺陷- 就是YAML的意思,写出来。
的合并密钥 << deserves its own note,因为它的优先规则很容易倒退,在子映射中显式写入的键战胜合并拉入的键,在例子中, worker 120的宽限期结束,而不是30,无论合并线出现在显式密钥的上方还是下方,转换器实现了该规则,因此JSON向您展示了有效的,合并后的配置- 这通常是您实际想要检查的内容。
由此可见两个实际用途:首先,当配置使用重锚定时,转换为 JSON 是回答 "此环境实际上解析为什么?"而不运行部署的最快方法。其次,如果别名没有匹配的锚 - 将一个大文件分成几个文件的常见结果 - 转换器将其报告为行号错误,而不是默默地生成空。
块标量如何转换
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 上插入选项卡的编辑器是通常的来源;大多数都有一个 "将缩进转换为空格 " 命令,可同时修复整个文件。
2步:选择输出形状
挑 2 个空格、 4 个空间、或者 精简. 缩小是你要将结果粘贴到 a 中时所要的 curl body 或环境变量。缩进输出是当人类必须阅读它时你想要的。
排序键 every levels上按字母顺序重写对象键,这在比较一个config的两个版本时是非常宝贵的:两个文件仅在键顺序上不同,会产生相同的排序JSON,因此一个diff只显示真正的变化,将两个输出都馈送到 JSON 迪夫 工具,您可以获得精确的结构比较,而不是逐行比较。
保持弦乐 disables 标量强制,如上所述,当你想看到每个值的原始文本时,或者下游消费者无论如何都把所有内容都当成字符串时,使用它。
3步:转换并读取错误
单击 兑。如果文档格式良好,JSON 会与行计数、密钥计数、字节大小以及 - 对于多文档流 - 找到多少个文档一起显示在下面。
如果格式不正确,错误会命名该行。消息涵盖了实践中实际发生的故障:用于缩进的选项卡、与其兄弟姐妹不一致缩进的行、未终止的引用字符串、没有锚的别名、指向非映射的合并键。行号将五分钟的狩猎变成五秒的修复。
4步:复制、下载或继续进行
将 JSON 复制到剪贴板或将其下载为 .json 文件。从那里开始,常见的后续步骤是漂亮的打印和验证 json格式化程序为配置加载器生成类型 json 打字稿或者与以下机构签订 CI 验证合同 JSON 模式生成器。
这符合实际的工作流程
调试一个清单,"看起来不错"
Deployment 行为出乎意料,YAML 读取正确时,转换它。JSON 在十分之九的情况下立即显示问题:一个值变成布尔值,一个嵌套键因为杂散空间而比预期浅一级,一个锚扩展到陈旧的 JSON 视图,消除了使错误不可见的空白歧义。
根据配置编写脚本
Shell 和 Node 脚本原生处理 JSON;YAML 需要依赖,当我需要从一捆清单中拉出每个图像标签时,先转换为 JSON 并通过管道 jq yaml库添加到一次性脚本中要快,这里的转换器'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文件是团队拥有的最敏感的纯文本工件之一,它们带有内部主机名,集群名称,注册表路径,服务帐户,数据库标识符,以及 - 尽管每个人'的最佳意图 - 偶尔还没有成为秘密管理器的凭据。
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 文件中。如果您点击了其中一个,您正在使用为特定语言编写的文档's YAML 库,而该库'自己的自卸程序是正确的工具。
常问问题
如何在线将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 字符串。折叠块将连续的行与空格连接,并将空行视为段落空行。尊重咀嚼指标:减去尾随换行符,加号保留每条尾随空行符。



