YAML 转 JSON 转换器

粘贴 YAML(Kubernetes 清单、Docker Compose、CI 配置),立即得到整洁的 JSON。错误会用指示符标出确切的行。

在浏览器中运行无需注册不上传任何数据

JSON 输出

如何使用YAML 转 JSON

  1. 把 YAML 粘贴到左侧输入框,或打开一个 .yaml/.yml 文件。
  2. JSON 会随着你的输入实时显示在右侧。输出可选择 2 个空格、4 个空格或制表符缩进。
  3. 勾选按键排序,可按字母顺序排列键,便于比较配置。
  4. 如果 YAML 无效,状态栏会显示行号和列号,出错的行会显示在下方,并用 ^ 标记出位置。
  5. 复制或下载 JSON,或按互换把它转换回 YAML。

YAML 如何映射为 JSON

JSON 是 YAML 1.2 的子集,因此每个 YAML 映射都会变成 JSON 对象,每个序列都会变成数组,标量则变成字符串、数字、布尔值或 null。YAML 独有的特性会在转换时被处理:

  • 注释(# …)会被丢弃,因为 JSON 没有注释。
  • 锚点和别名(&base、*base、<<: *base)会被展开为完整的副本。
  • 时间戳,例如 2024-01-02,会变成 ISO 8601 字符串。
  • 多行字符串(| 字面块和 > 折叠块)会变成带有 \n 转义的普通字符串。

多文档 YAML

一个文件可以包含多个以 --- 分隔的 YAML 文档,这在 Kubernetes 清单中很常见。JSON 没有对应的结构,因此转换器会返回一个每个文档对应一个元素的 JSON 数组,并在状态栏中说明。末尾单独的 --- 会被忽略。

YAML 1.1 与 1.2 的坑

本转换器遵循当前规范 YAML 1.2。许多较旧的工具(PyYAML、Ruby 的 Psych、某些版本的 Kubernetes 和 Ansible)仍按 YAML 1.1 读取,而两者的规则有所不同:

  • 挪威问题:在 YAML 1.1 中,country: no 表示 false,于是挪威的国家代码 NO 就消失了。yes、on、off、y 和 n 也是如此。YAML 1.2 只把 true 和 false 视为布尔值。
  • 八进制数:0755 在 1.1 中是八进制,在 1.2 中则是普通十进制数(1.2 使用 0o755)。为安全起见,请给文件权限加上引号。
  • 六十进制数:在 1.1 中,22:30 可能被解析为数字 1350。请给时间和端口映射加上引号,例如 "8080:80"。

JSON → YAML 方向会自动给有歧义的字符串('no'、'on'、'y')加上引号,因此生成的 YAML 在两个版本中读取结果都相同。

常见问题

我的 YAML 会被上传到任何地方吗?
不会。解析由开源库 js-yaml 在你的浏览器中完成。包含密钥或内部主机名的配置永远不会离开你的电脑。
为什么我的 YAML 报“bad indentation”错误?
YAML 的嵌套由空格决定,缩进中不允许使用制表符。请确保同级的键完全对齐,并且列表项(-)在其父键下的缩进保持一致。
YAML 注释会怎样处理?
会被删除。JSON 没有注释语法,因此注释无法保留。再转换回 YAML 也不会恢复它们。
为什么 <code>no</code> 仍然是字符串?
本工具遵循 YAML 1.2,其中只有 true/false 是布尔值。较旧的 YAML 1.1 解析器会把 no、yes、on 和 off 变成布尔值(即“挪威问题”)。
可以转换包含多个资源的 Kubernetes 清单吗?
可以。每个以 --- 分隔的资源都会成为输出 JSON 数组中的一个元素,可直接用于 jq 或 kubectl apply -f -(它同样接受 JSON 列表)。

相关工具