跳到内容

📝 TOML ⇔ JSON / YAML 转换器

TOML 与 JSON / YAML 双向转换。适用于 Hugo config.toml、Cargo.toml、pyproject.toml 编辑。

完全免费 无需注册 浏览器内完成 5 种语言 深色模式

🔒 关于隐私

📖 常见的坑

把 TOML 转换为 JSON 或 YAML,也支持反向转换,便于读懂 Cargo.tomlpyproject.toml、Hugo 的 config.toml 这类配置文件。处理全部在浏览器内完成。TOML 是为「人手写、人来读的配置文件」而设计的格式,并非数据交换格式——因此它与 JSON、YAML 之间存在若干无法弥合的差异

情形 会发生什么 怎么处理
有些 JSON 值无法转成 TOML TOML 没有 null这是规范层面的取舍而非实现限制,其依据是这样一个设计理念:在配置文件中,「没有值」应当通过「不写这个键」来表达。因此 {"timeout": null} 在 TOML 中无法表示。出于相近的理由,类型混杂的数组([1, "two", true])也被许多实现拒绝——TOML 1.0 是允许的,但各解析器的支持参差不齐。想把 API 响应直接转成 TOML,首先就会卡在这两点上。 请在转换前剔除值为 null 的键——若要贴合 TOML 的设计理念,这才是正确的处理。若想显式表达「没有值」,就填入对该键而言有意义的默认值,例如空字符串或 false更进一步,不要拿 TOML 做数据交换——它的用途不在此。TOML 适合由人手工编辑、以 diff 形式评审的配置文件,而机器生成、机器读取的数据应当用 JSON。如果你觉得「这个结构用 TOML 很难写」,那可能是个信号:它作为配置已经过于复杂了——嵌套超过三层时,就值得重新审视设计。
结构相同,转换结果看着却和手写的不一样 TOML 可以用三种写法表达同样的数据:表头 [server]、表数组 [[bin]],以及内联表 { host = "x", port = 80 }。转换器只会挑其中一种输出,因此即便结构完全相同,产出的样子也可能与你手写的截然不同。最容易造成混乱的,是表头「按位置决定归属」的特性写在 [server] 之后的所有键都属于 server。行的顺序是有意义的,所以把一个键上下挪一行,它所属的表就变了 这些输出全都是合法的 TOML——若想贴近手写风格,只能以转换结果为起点再手工整理。另外,不要用本工具对既有配置文件做来回转换,有一个决定性的理由:注释会被完全丢弃。JSON 没有注释的概念,因此把 Cargo.tomlpyproject.toml 经 JSON 重新格式化,会扔掉该文件中最有价值的信息,比如「为什么这个依赖被锁定在这个版本」请把本工具用于「读懂」,编辑则直接在原文件上进行。
日期变成了字符串,或者字符串变成了日期 TOML 把日期时间作为一等类型created = 1979-05-27T07:32:00Z 不带引号书写,它是日期时间值而非字符串。JSON 没有这种类型,因此转换后变成 ISO 8601 字符串——这一步的翻译相当自然。问题出在反方向:把 JSON 的 "2024-01-01" 转回 TOML 时,某些实现会去掉引号、生成日期类型,语义随之改变。若你处理的是版本日期,或只是长得像日期的标识符(例如名为 "2024-01-01" 的发布版本),仅仅来回转换一次,类型就变了 处理长得像日期的字符串时,不要来回转换。不得已时,请用眼睛看一遍转换后的 TOML,确认引号加在了你想要的那一侧——created = 2024-01-01 是日期,created = "2024-01-01" 是字符串,就是这一对引号决定了类型。若想在设计阶段就规避这个问题,给不希望被当作日期的值加个前缀是有效的做法(例如 "v2024-01-01")。TOML 有三种时间类型——本地日期、本地时间、带偏移的日期时间——含义各不相同;凡需要时区信息的值,请务必写上偏移。

配置文件承载的不只是结构,还有约定。pyproject.toml 的键名由 PEP 518 与 PEP 621 规定,改动 [project][build-system] 的形态,pip install -e . 就会失败Cargo.toml 同理:[[bin]] 必须是表数组,写成 [bin] 含义完全不同。因此本工具的正当用途,是读懂别人写的配置文件的结构,而不是作为重新格式化或改写的通道。其次,TOML 没有 YAML 那样的锚点与引用机制——同一个值必须在多处重复书写,看起来有些啰嗦,但这正是「配置文件应当自上而下顺读即可理解」这一设计取舍的结果。若想提取公共部分,不要试图在 TOML 内部解决,请在生成该文件的脚本里解决。

📖 使用方法

  1. 1
    粘贴 TOML
    在左侧粘贴 TOML 或选择示例。
  2. 2
    选择目标格式
    选择 JSON 或 YAML。JSON 可指定缩进宽度。
  3. 3
    双向转换
    右侧显示结果。反向转换也实时进行。

❓ 常见问题

什么是 TOML?
Tom 的明显最小语言。用于 Cargo、Hugo、pyproject。
日期和时间如何处理?
TOML 有 datetime/date/time 类型。JSON 中转为 ISO 8601 字符串。
可以反向转换吗?
是。在右侧粘贴并点击 → TOML。TOML 无法表示的结构会被跳过。
🐛 此工具出现问题了吗?

免费、无需注册。仅提供复现步骤也有帮助。报告将直接发送给运营者并用于改进。

※ 为复现问题,浏览器信息 (UA / 屏幕 / 语言 / URL) 将自动发送