📝 TOML ⇔ JSON / YAML 转换器
TOML 与 JSON / YAML 双向转换。适用于 Hugo config.toml、Cargo.toml、pyproject.toml 编辑。
完全免费
无需注册
浏览器内完成
5 种语言
深色模式
🔒 关于隐私
- ・所有处理均在您的浏览器中完成
- ・输入数据绝不会发送到任何服务器
已复制
📖 常见的坑
把 TOML 转换为 JSON 或 YAML,也支持反向转换,便于读懂 Cargo.toml、pyproject.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.toml 或 pyproject.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
粘贴 TOML在左侧粘贴 TOML 或选择示例。
-
2
选择目标格式选择 JSON 或 YAML。JSON 可指定缩进宽度。
-
3
双向转换右侧显示结果。反向转换也实时进行。
❓ 常见问题
什么是 TOML?
Tom 的明显最小语言。用于 Cargo、Hugo、pyproject。
日期和时间如何处理?
TOML 有 datetime/date/time 类型。JSON 中转为 ISO 8601 字符串。
可以反向转换吗?
是。在右侧粘贴并点击 → TOML。TOML 无法表示的结构会被跳过。
🔗 相关工具
🐛 此工具出现问题了吗?
免费、无需注册。仅提供复现步骤也有帮助。报告将直接发送给运营者并用于改进。
✅
感谢您的反馈!
已送达运营者,将用于改进工具。