实用工具

TOML 与 JSON 互转

TOML 转 JSON、JSON 转 TOML,Cargo.toml、pyproject.toml 都能转,表和日期完整保留。

浏览器本地运行数据格式308
免费

输入

0 B

结果

结果会显示在这里。

Cargo.toml、pyproject.toml、netlify.toml 以及很多 Hugo 站点的配置都用 TOML 写,迟早你会需要把它们转成 JSON——用 jq 查询、交给脚本处理,或者按结构比较两个版本。这里用 smol-toml 双向转换,它是一个小巧的 TOML 1.1 解析和序列化库,通过了官方 toml-test 测试集的绝大多数用例;规范本身维护在 toml-lang/toml。语法错误会给出行号和列号,遇到一种格式表达不了的内容时,转换会停下并指明具体的键,而不是悄悄丢掉。

它是怎么工作的

  • 内联表、点号键和 [[bin]] 这样的表数组,都会变成普通的嵌套 JSON 对象和数组。
  • 带时区的日期时间转成 ISO 8601 字符串;本地日期和本地时间保持原写法,比如 1979-05-27。
  • JSON 的 null 在 TOML 里没有对应物,smol-toml 默认会直接丢掉这个键,这里改为报错并指出是哪个键。
  • 转成 TOML 时,嵌套对象变成 [表] 段落,对象数组变成 [[数组]] 表。

你的数据去了哪里

哪也没去。本工具完全在你的浏览器里运行:你粘贴的文本由页面处理,不会传输到任何服务器,也不会写进任何日志。

本工具免费且无需登录,运行结果只存在于你当前的页面里,不会被保存到任何地方。

它要花多少

本工具完全免费,不需要登录,也不消耗积分。

常见问题

为什么有 null 值就转不了?
TOML 没有 null。如果转换器悄悄跳过这个键,生成的文件看着没问题,行为却变了。所以这里会拒绝转换,并用 $.package.homepage 这样的路径告诉你位置。删掉这个键,或者给它一个真实的值,比如空字符串或 false。
我的日期时间为什么变成了带引号的字符串?
JSON 没有日期类型,TOML 日期转成 JSON 时只能变成字符串。再把这份 JSON 转回 TOML,得到的是带引号的字符串而不是裸的 TOML 日期,因为 JSON 里没有任何信息表明它曾经是日期。需要真正的 TOML 日期的话,手动去掉引号即可。
注释和键的顺序会保留吗?
TOML 转 JSON 时键的顺序会保留。JSON 转 TOML 时,每个表里的普通键会写在它的子表之前,因为在 TOML 里,写在 [表] 标题之后的键属于那个表。注释不会保留:解析 TOML 时注释就被丢弃了,因为 JSON 没地方放它们,所以经过 JSON 转一圈,数据还在,说明没了。建议把 TOML 文件当作唯一的源头,需要 JSON 时再从它生成。
特别大的整数会怎样?
TOML 整数是 64 位的,而 JavaScript 数字只在 2^53 以内是精确的。解析器不会把 9007199254740993 悄悄舍入成另一个数,而是直接报错。雪花 ID 这类值更适合存成字符串。同理,inf 和 nan 也会被拒绝,因为 JSON 表示不了它们。

背后的开源项目

本工具运行在 squirrelchat/smol-toml 之上,以 BSD-3-Clause 许可发布。如果你需要在自己的程序里实现同样的能力,直接用这个库。

squirrelchat/smol-toml

也常被称作

  • toml转json
  • json转toml
  • toml在线解析
  • toml格式校验
  • cargo.toml转json
  • pyproject.toml