piapia123
zh

TOML ↔ JSON 互转

格式化

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

把一份 TOML(Cargo.toml、pyproject.toml、各种 `*.toml` 配置)转成 JSON,或反过来。用的是完整的 TOML 1.0 实现,所以四种日期时间、多行字符串、点号键、表数组 `[[x]]`、十六进制与带下划线的数字都能正确处理 —— 自己写一个「key = value 加几个小节」的子集,必然会在某个输入上静默解析成另一个意思。 三处会静默改掉数据的地方都做了处理: · 本地日期与本地时间不做时区换算。 TOML 的 `1979-05-27` 是「这一天」,不是「这一天的零点 UTC」;`07:32:00` 也没有时区。当成时刻去转,东八区的用户会看到日期整体差一天。 · 大整数不丢位数。 超过 2^53 的整数以字符串输出(`9223372036854775807` 转成 Number 会变成 `...5808`),类型变了但一个字符不差。 · `inf` / `-inf` / `nan` 不会变成 null。 JSON 没有这三个值,而 `JSON.stringify(Infinity)` 的结果是 `null` —— 不报错,只是 `inf = inf` 静默成了 `{"inf": null}`。这里转成字符串,值看得见。 反方向(JSON → TOML)有个绕不开的问题:TOML 没有 null 类型,而默认行为是把那个键整个丢掉。所以这里默认直接报错并指出是哪一个键,选项里可以改成写空字符串或跳过。

功能

  • 两个方向:TOML → JSON、JSON → TOML,方向可自动判断也可手动指定
  • 四种日期时间都按规范处理:本地日期、本地时间不做时区换算(否则会整体差一天)
  • 表数组 [[x]] 与对象的数组互转,点号键展开成嵌套对象,需要引号的键会自动引起来
  • 大整数按 BigInt 处理:超过 2^53 的以字符串输出,位数一个不丢
  • inf / -inf / nan 转成字符串,不会像 JSON.stringify 那样静默变成 null
  • JSON → TOML 时遇到 null 会报错并指出路径(TOML 没有 null 类型,默认会丢键)
  • null 也可以选择写成空字符串或跳过键;数组里的 null 不允许跳过(会让后面下标全变)
  • 解析错误指到具体的行与列,而不是一句「格式不对」
  • 顶层不是对象时说清楚「TOML 的顶层永远是一张表」,而不是抛一句英文
  • 输出带语法着色,JSON 缩进支持 2 / 4 空格与制表符

使用方法

  1. 把 TOML 或 JSON 粘进输入框 —— 能解析成 JSON 的按 JSON 处理,其余按 TOML
  2. 结果实时出现,方向也可以手动指定
  3. JSON 转 TOML 时如果报了 null,选一种处理方式再继续
  4. 点复制取走结果

常见问题

为什么我的 JSON 里有个 null,它却报错了?
因为 TOML 根本没有 null 类型。把 null 转过去有三种下场,没有一种是「无损」的:整个键消失(这是库的默认行为,最危险 —— 你会拿到一份少了一个字段的配置)、写成空字符串(键保住了,类型从 null 变成了字符串)、或者跳过这个键。这里默认选报错并指出是哪一个键,因为另外两种都会让你拿到一份看着正常、其实变了样的配置,而你不会有任何提示。知道是哪一个键之后,从上面选一种即可继续。
为什么大整数变成了字符串?inf 和 nan 也是?
因为 JSON 表达不了它们。超过 2^53 的整数在 JavaScript 里无法精确表示 —— `9223372036854775807` 会变成 `...5808`,尾数悄悄丢了。而 `inf` / `-inf` / `nan` 更是连表示都没有:`JSON.stringify(Infinity)` 的结果是 null,不报错。与其输出一个看起来正常、其实已经错了的值,不如输出成字符串 —— 类型变了,但值一个字符不差,而且你在结果里看得见这个变化。
本地日期为什么不带时区?
因为它在 TOML 里本来就没有时区。`birthday = 1979-05-27` 表示的是这一天,`alarm = 07:32:00` 表示的是这个时刻,都不指某个具体的时间点。如果转换时把它当成「1979-05-27 00:00 UTC」再按你的时区渲染,东八区会显示成 5 月 26 日 —— 日期整体差一天。所以这里原样输出 `1979-05-27`,不加 `Z`。带时区的那两种(`1979-05-27T07:32:00Z` 与 `...-07:00`)则会保留偏移量。
为什么注释不见了?
JSON 里没有可以承载注释的结构 —— 它只有对象、数组和标量。转成 JSON 时注释只能丢弃。反方向(JSON → TOML)本来就没有注释可保留。如果注释很重要,建议保留一份原始 TOML,不要把它当作「转换的中间产物」。

相关工具