HandyTools Hub
← 返回工具列表

YAML/JSON 转换器

在 YAML 和 JSON 格式之间转换,支持语法高亮。

转换结果将显示在此处...

使用方法

  1. 输入您的数据 — 将您的 YAML 或 JSON 数据粘贴到转换器左侧的输入框中。
  2. 点击转换 — 选择转换方向并点击“转换”按钮以转换数据格式。
  3. 查看输出 — 转换后的结果会显示在输出面板中,带有语法高亮以便阅读。
  4. 复制结果 — 点击“复制输出”按钮将转换后的数据复制到剪贴板以供即时使用。

转换器做了什么

这个工具是 YAML 与 JSON 之间的双向桥梁。YAML 转 JSON 会把文本交给 js-yaml 的 load,再用两空格缩进执行 JSON.stringify。JSON 转 YAML 则执行 JSON.parse,再用 js-yaml 的 dump,同样使用两空格缩进。所有处理都在浏览器标签页内完成,页面加载后不需要网络请求。语法错误会附带行号报告,因此 “at line 4” 这样的信息能直接指向出错的缩进或字符。面板还提供复制和下载,方便你把结果保存为文件。

功能特性

  • YAML 转 JSON 转换 — 将 YAML 数据转换为 JSON 格式,带有正确的缩进和格式化。
  • JSON 转 YAML 转换 — 将 JSON 对象转换为简洁、人类可读的 YAML 格式。
  • 语法验证 — 自动验证您的输入并在转换前提醒任何语法错误。
  • 详细错误信息 — 对于无效输入,接收包含行号的清晰、可操作的错误信息。
  • 一键复制 — 一键将转换后的输出复制到剪贴板。
  • 语法高亮 — 输入和输出都带有颜色编码,以提高可读性和更轻松的调试。

类型猜测:YAML 中的真正风险

YAML 标量是无类型的文本,解析器事后决定每个标量是字符串、数字、布尔值、null 还是时间戳。这个猜测正是大多数转换错误的起点,因为同样的字符在不同解析器中可能解析成不同的类型。

你写的在此解析为意外之处
version: 1.10数字 1.1末尾的零丢失
zip: 01234数字 1234前导零丢失
country: NO字符串 "NO"YAML 1.1 解析器会读成 false(挪威问题)
enabled: yes字符串 "yes"YAML 1.1 解析器会读成 true
flag: True布尔值 truetrue 和 false 不区分大小写
count: 1e3数字 1000科学计数法会被当作数字
id: 12345678901234567890舍入后的数字超过 2^53 后精度丢失
big: .infInfinity,随后 nullJSON 无法表达

教训不是说 YAML 坏了,而是未加引号的标量带有含义。挪威问题是最典型的例子:写作 NO 的国家代码对 YAML 1.2 解析器是字符串,对 YAML 1.1 解析器却是布尔值 false。当两个系统对 schema 的理解不一致时,数据会在无声中改变含义。

实操示例:一份部署配置

考虑这个输入:

service: checkout
version: 1.10
retries: 3
enabled: yes
region: NO

JSON 输出为:

{
  "service": "checkout",
  "version": 1.1,
  "retries": 3,
  "enabled": "yes",
  "region": "NO"
}

有两件事在无声中出了错。版本号丢了末尾的零,而 enabled 和 region 是字符串,任何读文件的人都会以为它们是布尔值和国别代码。修正后的 YAML 给有歧义的值加上引号:

service: checkout
version: "1.10"
retries: 3
enabled: "yes"
region: "NO"

这样就没有任何解析器能重新解释它们了。

强制字符串与保留原值

加引号是主要手段。双引号最通用;单引号也可以,而且 YAML dumper 在需要保护字符串时正是输出单引号。你还可以用 version: !!str 1.10 这样的标签明确指定类型。把 JSON 转回 YAML 时,dumper 会替你完成这项工作:JSON 字符串 "yes" 会被写成 'yes',字符串 "1.10" 写成 '1.10',正是为了重新读取 YAML 时不会把它们变成布尔值或数字。这就是为什么 JSON 到 YAML 再回到 JSON 的往返能正确保留字符串值。

常见错误与限制

  • 注释被丢弃。 JSON 没有注释,解析后的模型也不会保留它们。
  • 锚点和别名会被展开。 YAML 引用会变成被引用数据的独立副本,因为 JSON 没有别名机制。
  • 重复键会被拒绝。 同一个键出现两次的映射会抛出 duplicated mapping key 错误,而不是静默采用最后一个值。
  • 每次只能转换一个文档。 --- 分隔符会产生错误;请分段转换。
  • 制表符不能用于缩进。 YAML 要求使用空格,制表符通常导致解析错误。
  • JSON 输入必须严格。 键需要双引号,且不允许尾随逗号。
  • 多行字符串会改变形态。 输出时换行会变成 YAML 块标量,这合法,但看起来与最初的 JSON 字符串不同。

YAML 还是 JSON:该写哪一个

两种格式重叠很多,因此选择通常取决于谁来编辑文件以及消费方有多严格。YAML 手写起来很舒服:支持注释、省略大部分括号和花括号,还能用块标量处理多行字符串。代价是对缩进敏感,以及上面描述的类型猜测。JSON 无歧义,几乎每种语言和 API 都支持,但它没有注释、要求键加引号,并且拒绝尾随逗号。

情况更好的选择
带注释、手工编辑的配置YAML,并给有歧义的字符串加引号
API 请求或响应体JSON
跨语言边界的数据JSON,因为它的类型是固定的
被 YAML 1.1 工具消费的配置YAML,但给任何可能成为布尔值的项加引号
必须保留前导零或末尾小数的值两者皆可,但要给值加引号

一条实用规则:人类编写和审阅的地方用 YAML,机器交换的地方用 JSON,并给任何可能被解析器误认为数字或布尔值的字符串加引号。

使用场景

  • 在格式之间转换配置文件 — 在需要特定格式的工具或平台之间迁移时,轻松在 YAML 和 JSON 配置文件之间切换。
  • 验证 YAML 语法 — 在将配置文件部署到生产环境之前,粘贴 YAML 数据以即时检查语法错误。
  • 转换 API 响应 — 将 JSON API 响应转换为 YAML 格式,用于文档、日志记录或与基于 YAML 的系统集成。
  • 在配置格式之间迁移 — 在使用 YAML 或 JSON 的 Docker Compose、Kubernetes、GitHub Actions 等工具之间移动时,简化您的工作流程。

相关工具

常见问题

什么是 YAML?

YAML (YAML Ain't Markup Language) 是一种人类可读的数据序列化格式,常用于配置文件和数据交换。它使用缩进表示结构,便于人类读写,同时可由机器解析。

YAML 和 JSON 有什么区别?

YAML 更人类可读且支持注释,非常适合配置文件。JSON 在编程语言中支持更广泛,是 API 响应的标准格式。YAML 用缩进表示结构,JSON 用花括号和方括号。两种格式可以表示相同的数据结构。

可以转换复杂的嵌套结构吗?

可以,该工具完全支持复杂的嵌套对象、数组和多级结构。无论是深度嵌套的配置文件还是复杂的数据层级,转换器在 YAML 和 JSON 格式之间转换时都能保留完整结构。

为什么 version: 1.10 会变成 1.1?

YAML 没有明确的数字类型,解析器只能猜测。标量 1.10 看起来像浮点数,解析成 JavaScript 数字后末尾的零没有意义,因此 1.10 和 1.1 是同一个值,JSON 输出就会打印 1.1。如果版本号必须原样保留为文本,请在源文件中加引号:version: "1.10"。引号会告诉解析器把字符当作字符串,数值就能完整往返。

country: NO 会在这个转换器里变成 false 吗?

在这里不会。本转换器使用 js-yaml 的默认核心 schema,其中只有 true 和 false(不分大小写)是布尔值,因此 NO 会被读写成字符串 "NO"。著名的挪威问题属于 YAML 1.1 解析器(例如某些版本的 PyYAML),它们会把未加引号的 NO、yes、on、off 当作布尔值。由于同一份文件在不同工具里可能有不同含义,稳妥的做法是给任何可能被误认为布尔值的字符串加上引号。

转换后我的 YAML 注释去哪了?

JSON 没有注释语法,因此注释无法在 JSON 输出中表示,在加载 YAML 时就被丢弃了。如果保留注释很重要,请保留原始 YAML 文件,把 JSON 当作派生产物。从 JSON 转回 YAML 也不会恢复它们,因为这些信息从未存入解析后的数据里。

由 HandyTools Hub 团队审校 · 最后更新