跳到主要内容

YAML 与 JSON 互转

配置文件格式互转,并解释那些反直觉的规则

显式暴露类型陷阱支持块标量与锚点不上传
转换方向

输入

转换结果

注意 YAML 的类型规则:007 会读成数字 7,08 反而是字符串;1e3 是字符串,而 1e+3 才是数字 1000;yes/on 会读成布尔真;1_000 会读成数字(y 和 n 不再是布尔)。

最后更新:2026-10-11

工具介绍

YAML 是配置文件的主流格式,但它的类型推断规则相当反直觉:007 会被读成数字 7,1e3 反而是字符串,而 yes 和 on 会被当成布尔真。这些规则来自 YAML 1.1 规范,大多数解析器都遵循它们 —— 你以为写的是字符串,读出来的是数字,这类问题排查起来非常费时。本工具在转换的同时把这些「陷阱」显式暴露出来,让你看到数据到底被理解成了什么。同时支持块标量、锚点别名、多文档等常见语法,解析出错时给出准确的行号。

功能特性

严格遵循 YAML 1.1 规则

007 读成 7、0x1f 读成 31、1e3 保持字符串、yes 与 on 读成布尔 —— 这些反直觉行为与主流解析器一致,而不是「看起来合理」的自创规则。

块标量完整支持

| 保留换行、> 折叠成空格、|- 与 |+ 控制末尾换行、|2 指定缩进。其中 clip 语义(默认是否补末尾换行)取决于原文末尾有没有换行,这一细节已按实测结果实现。

锚点与别名

支持 &anchor 定义与 *alias 引用,解析时展开成实际内容,便于处理带复用片段的配置。

多文档支持

用 --- 分隔的多份文档会转成数组,每份作为一个元素,不丢文档。

字符串往返不变形

这是最关键的一条保证:JSON 里写成字符串的 "007" 转成 YAML 后读回来必须还是字符串,否则一次转换就把数据改坏了。

不确定就报错

遇到不支持的语法会明确报错并给出行号,绝不用一个「看起来对」的结果糊弄过去 —— 错误的 JSON 最不容易被发现。

怎么用

  1. 1

    选择方向

    YAML → JSON 或 JSON → YAML。

  2. 2

    粘贴内容

    把配置文件内容粘进输入框。

  3. 3

    查看类型解读

    检查数字、布尔、空值是否被理解成了你预期的类型。

  4. 4

    复制结果

    复制转换后的内容,或下载为文件。

参数说明

方向
YAML 转 JSON,或 JSON 转 YAML。
缩进
输出 YAML 时使用的缩进空格数,默认 2。
流式风格
是否对短数组使用 [...] 的紧凑写法,便于阅读。
行号提示
解析失败时显示行号,便于在长配置文件里定位。

适用场景

  • 把 Kubernetes、CI、Docker 的 YAML 配置转成 JSON 检查结构
  • 把 JSON 配置改成更易读的 YAML 格式
  • 排查配置里某个值究竟被解析成了字符串还是数字
  • 检查多文档 YAML 里每份文档的内容
  • 在两种格式间往返,确认转换不会改变数据类型

常见问题

关于这个工具,你可能会问

为什么 007 会变成数字 7?

因为 YAML 1.1 规范规定,以 0 开头、后面全是数字的字面量按八进制或十进制整数解析。所以 007 会被读成数字 7,而 0o17 这种带前缀的写法在 PyYAML 里反而被当成字符串。这类规则非常反直觉,但它是规范行为,主流解析器都遵循。本工具选择跟随规范而不是「看起来合理」的自创规则 —— 因为一旦你的配置被别的系统读取,遵循规范的解析器会按规范解释,你在本地看到的友好结果反而是误导。想保留字符串请写成 '007'。

1e3 为什么会是字符串?

因为 YAML 1.1 要求科学计数法必须带小数点,只有 1.0e3 这样的写法才会被解析成数字,而 1e3 保持字符串。这条规则同样反直觉,但用 PyYAML 实测确认过。后果是:如果你写 timeout: 1e3 期望它是 1000,某些系统会把它当字符串,导致比较或计算出现意外。建议直接写成 1000,语义最明确。

yes 和 no 是布尔值吗?

在 YAML 1.1 里是。除了 true/false,还有 yes/no、on/off、y/n 这几组词都会被解析成布尔值。这在配置里非常危险:比如 password: no 本来可能想表示字符串 "no",结果得到了布尔 false。所以对任何可能被误判的值,加引号是稳妥习惯。

块标量的 | 和 > 有什么区别?

| 是字面块,内容里的换行原样保留,适合放脚本片段或代码。> 是折叠块,相邻的非空行会被合并成一行、中间用空格连接,只有空行才产生换行,适合放长段落的散文。两者都可以加修饰符:|-(去掉末尾换行)、|+(保留全部末尾换行)、|2(指定内容缩进为父缩进加 2)。

为什么制表符会报错?

因为 YAML 规范明确禁止用制表符做缩进 —— 只允许空格。这是一个历史遗留决定,但所有合规解析器都会拒绝含 Tab 缩进的文档。本工具会明确指出是制表符问题及其行号,而不是笼统地报语法错误,因为从编辑器里看,一个 Tab 和几个空格看起来几乎一样,不知道原因很难排查。

重复的键会怎样?

会报错。YAML 规范里同一映射内的键必须唯一。早期实现常见的做法是「后者覆盖前者」,但那会让一处笔误静默吞掉一整段配置 —— 比如不小心把两段都写成 database:,结果前一段的全部内容消失且没有任何提示。本工具选择显式报错,让问题在转换时就被发现。

锚点和别名是怎么处理的?

&name 定义一个锚点,*name 引用它。解析时本工具会把引用处展开成锚点指向的实际内容,因此输出 JSON 里每个引用处都有完整的数据,不存在「引用」这种概念。这样处理是因为 JSON 本身没有锚点机制,展开是唯一能表达「两处内容相同」的方式。缺点是输出可能比输入冗长,但信息完整无歧义。

为什么有的 YAML 转出来是 null?

因为那确实是一份空文档。一份只包含注释、或者完全为空的 YAML 文件,按规范读出来就是空值。本工具会输出一个内容为 null 的文档。需要说明的是,这与 PyYAML 的 safe_load_all 略有不同 —— 它对空文档返回「零个文档」,而我们返回「一个内容为 null 的文档」。从用户视角看,一份 YAML 就是一份文档,说「0 个文档」更让人费解,所以这里刻意不跟随那个行为。