TOML 至 JSON

Rust 的 Cargo.toml、Python 的 pyproject.toml、Hugo 的 config.toml:TOML 在现代配置领域无处不在,但许多工具仍然只认 JSON。把 TOML 粘贴到这里,就能得到排版整齐的 JSON:[表] 区块变成嵌套对象,[[表数组]] 区块变成对象数组,日期则按原样以字符串形式传递。这个解析器覆盖了 TOML 的日常核心用法;它真实的限制(多行值、内联表、点分隔键)在下方如实列出。

转换的工作方式

  1. 1

    粘贴你的 TOML

    把文本放进输入框,点击「转换为 JSON」。占据整行的 # 注释会被自动跳过。

  2. 2

    表变成对象

    `[server.database]` 这样的表头会变成嵌套的 JSON 对象,点号分隔的每个名称对应一层。

  3. 3

    表数组变成数组

    `[[users]]` 区块会构建一个 JSON 数组,每个区块对应一个对象。

  4. 4

    标量值保留类型

    带引号的字符串、简单十进制的整数和小数、true/false 都映射为原生 JSON 类型;日期保持为字符串,与书写时完全一致。

  5. 5

    复制 JSON

    结果使用 4 个空格缩进排版,键保持原有顺序,随时可以复制。

类型如何映射

TOML 值 JSON 值 示例
字符串(基本或字面量) 字符串 "hello" → "hello"
整数(简单十进制) 数字 42 → 42
浮点数(简单十进制) 数字 3.14 → 3.14
布尔值 布尔值 true → true
数组(单行) 数组 [1, 2, 3] → [1, 2, 3]
带键的表 对象 [server] + port = 8080 → "server": {"port": 8080}
表数组 对象数组 [[users]] + name = "alice" → "users": [{"name": "alice"}]
日期时间 字符串(按原样) 2026-04-18T10:00:00Z → "2026-04-18T10:00:00Z"

输出始终使用 4 个空格缩进排版,因此数组和对象会展开成多行;上表为了便于阅读把值写在一行里。键的顺序与你 TOML 中出现的顺序完全一致。

完整示例

title = "My App"

[server]
host = "localhost"
port = 8080

[[users]]
name = "alice"
admin = true

会转换为:

{
    "title": "My App",
    "server": {
        "host": "localhost",
        "port": 8080
    },
    "users": [
        {
            "name": "alice",
            "admin": true
        }
    ]
}

支持的 TOML 与真实的限制

支持:[表] 表头(包括点分隔的区块名)、[[表数组]]、单行的 key = value 键值对、带 \n、\t、\" 转义的基本字符串 "..."、字面量字符串 '...'、简单十进制的整数和小数、true/false、单行数组(允许嵌套)、占据整行的 # 注释,以及按字符串传递的日期。

不支持的部分,以及对应的做法:

  • 多行字符串(""" 或 ''')和多行数组会让解析器报错停止。请先把值写到一行里。
  • 内联表不会被展开:point = { x = 1, y = 2 } 会输出为字符串 "{ x = 1, y = 2 }",而不是对象。请把它改写成独立的 [point] 区块。Cargo.toml 的依赖行(例如 serde = { version = "1.0" })就是典型情况。
  • 等号左侧的点分隔键会保持为一个扁平键:server.host = "a" 生成的键是 "server.host",不会嵌套。请改用 [server] 表头。表头里的点分隔 [section.names] 则能正确嵌套。
  • 值后面的注释不会被剥离:port = 8080 # main 会变成字符串 "8080 # main"。注释请单独成行。
  • 超出简单十进制的数字格式不会被识别:1_000、0xFF、5e2、+99、inf 和 nan 都会以带引号的字符串输出。请写成 1000、255、500、99。
  • 基本字符串中的 \uXXXX 转义不会被解码。请直接粘贴真实字符。

如果要转换完整的 TOML 1.0 文档,请使用 toml2json 之类的命令行转换器,或先用 Python 的 tomllib 读取文件,再从那里输出 JSON。

适用场景

  • 调试时把一段 TOML 快速查看为 JSON。
  • 把简单配置值传给只接受 JSON 的 linter、脚本或资产清单工具。
  • 用手写更顺手的 TOML 笔记生成 JSON 测试夹具。
  • 迁移小而扁平的配置文件,Hugo 的很多 config.toml 就属于这一类。

往返转换须知

  • 注释永远不会保留:JSON 根本没有注释语法。
  • 日期仍是字符串;下游代码需要把它们重新解析成日期对象。
  • 大数:JSON 文本中的整数保留为 64 位值,但 JavaScript 一侧在超过 2^53 后会丢失精度。留意纳秒级时间戳和数字 ID。
  • 键的顺序在本转换器中保持书写时的样子;其他 JSON 工具重新输出文档时可能会重排键。

反向转换

JSON → TOML 才是更难走的路,因为 JSON 拥有 TOML 没有或处理方式不同的结构(深层匿名嵌套、null)。大多数往返场景都需要在 TOML 一侧手动调整。

常见问题

不能。JSON 没有注释语法,所以占据整行的 # 注释会被直接跳过。需要注意:写在值后面的注释不会被剥离,port = 8080 # main 会变成字符串 “8080 # main”。转换前请让注释单独成行。

不。它覆盖日常核心用法:点分隔区块名的表、表数组、单行 key = value 键值对、带引号的字符串、简单十进制数字、布尔值、单行数组和整行注释。多行字符串和多行数组、内联表、点分隔键,以及 1_000 或 0xFF 这类数字格式都不支持。要处理完整规范的文档,请使用 toml2json 或 Python 的 tomllib 等命令行工具。

常见的配置文件都能即时完成转换。转换在我们的服务器上运行,因此超大文档会受请求大小限制;几兆字节级别的 TOML 更适合用命令行转换器处理。

会。这个转换器在服务器端运行:TOML 通过 HTTPS 发送到我们的服务器,在那里完成转换,并随同一响应返回。内容之后不会被保存,只记录一次匿名使用计数。请不要粘贴密码或 API 密钥等机密信息。

相关工具

此工具还提供其他语言版本