Skip to content

TOML 转 JSON 转换器

在浏览器中粘贴 TOML,即刻得到 JSON。支持 Cargo.toml、pyproject.toml 与 config.toml,日期与嵌套表处理精准,100% 本地运行,无需上传,隐私安全。

无追踪 浏览器中运行 免费
选项 · 2 个空格
缩进
0 字符
JSON 输出
0
已针对 TOML 1.0.0 规范合规性、日期时间保真度与安全的大整数处理进行审核 — Go Tools 工程团队 · 2026年7月2日

什么是 TOML,为什么要转换为 JSON?

TOML(Tom's Obvious, Minimal Language,汤姆的显而易见的极简语言)是由 Tom Preston-Werner 创造的配置文件格式,追求无歧义、便于人类阅读,并可轻易映射为哈希表。它已成为 Rust 生态(Cargo.toml)、现代 Python 打包(pyproject.toml,由 PEP 518 与 PEP 621 标准化)以及 Hugo、Netlify、Poetry、Foundry 等工具的默认配置格式。相比之下,JSON 是通用的机器交换格式 — 每种语言都能解析它,每个 API 都用它交流。因此把 TOML 转换为 JSON 是一项常见任务:你用可读的 TOML 编写配置,然后转换为 JSON 以喂给程序、用 JSON 工具查看,或在流水线中做差异对比。

本工具有若干对正确性至关重要的差异化点:

**1. 日期时间保真。** TOML 拥有一等的日期与时间类型 — 带偏移日期时间、本地日期时间、本地日期和本地时间 — 而 JSON 完全没有。粗糙的转换器会把它们全部压平成 ISO 时间戳,于是像 1979-05-27 这样的本地日期会变成 1979-05-27T00:00:00Z,悄悄捏造出一个时间和一个时区。本工具会保留 TOML 的确切种类:本地日期保持为日历日期,本地时间保持为时间,只有带偏移日期时间才携带时区。这让你的数据保持诚实、往返转换无损。

**2. 完整的 TOML 1.0.0 支持。** 嵌套表、点分键、内联表以及表数组([[section]])都会使用零依赖的 smol-toml 库、按照 TOML 1.0.0 规范正确解析。混用内联表与标准表的真实 Cargo.toml 和 pyproject.toml 文件会严格按规范要求转换。

**3. 诚实的大整数处理。** TOML 整数是 64 位的,但浏览器 JavaScript 只能精确保存到 2^53 - 1 的整数。本工具不会悄悄破坏大数值或崩溃,而是转换为最接近的 JSON 数字并提醒你,让你可以选择改用字符串来存储该值。对这一根本浏览器限制的诚实,是大多数转换器一带而过的。

**4. 100% 基于浏览器的隐私。** 你的 TOML — 可能包含注册表令牌、内部包源或部署密钥 — 绝不会离开你的浏览器。无上传、无服务器、无日志。你可以在浏览器的「网络」标签中确认这一点。

需要反向转换?请使用 JSON 转 TOML 转换器。要在其他配置格式之间转换?试试 JSON 转 YAML 转换器YAML 转 JSON 转换器,或先用 JSON 格式化工具 验证并美化你的 JSON 输出。TOML、JSON 与 YAML 各有其用武之地:TOML 用于人工编辑的应用配置,JSON 用于机器交换,YAML 用于深度嵌套的基础设施清单。本转换器让你无需一行代码即可在前两者之间移动。

// Convert TOML to JSON in Node.js using the smol-toml library
import { parse } from 'smol-toml';

const toml = `
[package]
name = "my-app"
version = "1.0.0"

[dependencies]
serde = { version = "1.0", features = ["derive"] }
`;

const data = parse(toml);
const json = JSON.stringify(data, null, 2);

console.log(json);
// {
//   "package": { "name": "my-app", "version": "1.0.0" },
//   "dependencies": {
//     "serde": { "version": "1.0", "features": ["derive"] }
//   }
// }

核心功能

实时转换

当你输入或粘贴 TOML 时,JSON 输出会即刻更新 — 无需「转换」按钮。大型输入(>200KB)会自动切换到手动模式,以保持浏览器响应流畅。

日期时间保真

TOML 的带偏移日期时间、本地日期时间、本地日期和本地时间会被转换为保留原始种类的 JSON 字符串 — 不捏造午夜时间戳,因此往返转换保持无损。

完整 TOML 1.0.0 支持

嵌套表、点分键、内联表以及表数组([[section]])都会通过零依赖的 smol-toml 引擎正确解析,符合 TOML 1.0.0 规范。

Cargo.toml 与 pyproject.toml 就绪

针对现实中最常见的 TOML 文件优化 — Rust 清单与 Python 打包配置 — 包括内联表和表数组。加载一个示例即可看到确切的 JSON 结构。

诚实的大整数警告

超出 JavaScript 安全范围(2^53)的整数无法在 JSON 中精确表示 — 工具会把它们转换为最接近的数字并提醒你,而不是悄悄破坏数值。

100% 基于浏览器的隐私

所有解析都在你的浏览器本地运行。你的 TOML — 包括注册表令牌、私有包源和部署密钥 — 绝不会被上传、存储或记录。

示例

Cargo.toml(Rust)

[package]
name = "my-app"
version = "1.0.0"
edition = "2021"
authors = ["Jane Doe <jane@example.com>"]

[dependencies]
serde = { version = "1.0", features = ["derive"] }
tokio = { version = "1", features = ["full"] }

[dev-dependencies]
criterion = "0.5"

[[bin]]
name = "my-app"
path = "src/main.rs"

将 Rust 的 Cargo.toml 清单转换为 JSON — 便于工具链集成、依赖看板,或把 cargo 元数据喂给期望 JSON 的脚本。

pyproject.toml(Python)

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "my-package"
version = "0.3.1"
requires-python = ">=3.10"
dependencies = [
  "requests>=2.31",
  "pydantic>=2.0"
]

[project.optional-dependencies]
dev = ["pytest>=8.0", "ruff>=0.4"]

[tool.ruff]
line-length = 100

将 PEP 621 的 pyproject.toml 转换为 JSON,以编程方式查看项目元数据、依赖与工具配置。

netlify.toml

[build]
command = "npm run build"
publish = "dist"

[build.environment]
NODE_VERSION = "20"

[[redirects]]
from = "/old-path"
to = "/new-path"
status = 301
force = true

[[headers]]
for = "/*"

[headers.values]
X-Frame-Options = "DENY"

将 Netlify 构建配置转换为 JSON,用于审查重定向与响应头,或为其他平台生成等价配置。

Hugo config.toml

baseURL = "https://example.org"
languageCode = "en-us"
title = "My Hugo Site"
theme = "ananke"

[params]
description = "A static site built with Hugo"
mainSections = ["posts", "docs"]

[[menu.main]]
name = "Blog"
url = "/posts/"
weight = 1

[[menu.main]]
name = "About"
url = "/about/"
weight = 2

将 Hugo 站点的 config.toml 转换为 JSON,用于迁移设置、对比配置差异,或驱动配置界面。

rustfmt.toml

edition = "2021"
max_width = 100
hard_tabs = false
tab_spaces = 4
newline_style = "Unix"
use_small_heuristics = "Default"
reorder_imports = true
reorder_modules = true

将扁平的 rustfmt.toml 转换为 JSON — 这个例子很好地展示了顶层键值对(无表)如何直接映射为一个 JSON 对象。

含日期与表数组的应用配置

title = "Deployment Log"
last_deployed = 1979-05-27T07:32:00Z
release_date = 1979-05-27
maintenance_window = 02:00:00

[[servers]]
name = "alpha"
ip = "10.0.0.1"
ports = [8001, 8002]

[[servers]]
name = "beta"
ip = "10.0.0.2"
ports = [9001]

展示 TOML 原生日期时间(带偏移日期时间、本地日期、本地时间)与表数组如何干净地转换为 JSON 字符串与数组。

如何使用

  1. 1

    粘贴你的 TOML

    在上方输入框中输入或粘贴你的 TOML。你也可以点击「加载示例」来试用真实的 Cargo.toml、pyproject.toml 或部署配置。

  2. 2

    查看实时 JSON 输出

    JSON 会即刻出现在输出面板。调整「缩进」选项(2 或 4 个空格)以匹配你的目标格式。日期、表和表数组都会被自动处理。

  3. 3

    复制或下载

    点击「复制」把 JSON 抓到剪贴板,或点击「下载」保存为 .json 文件,供你的程序、API 或工具链直接使用。

常见 TOML 陷阱

未加引号的字符串值

在 TOML 中,字符串值必须加引号。等号右侧的裸词只有在布尔值(true/false)、数字、日期,或作为数组的一部分时才有效。请用双引号或单引号把字符串括起来。

✗ 错误
name = my-app
✓ 正确
name = "my-app"

重复的键

TOML 禁止在同一个表内两次定义同一个键,也禁止重新定义已经定义过的表。这在合并配置片段时是常见错误。每个键和每个表都必须唯一。

✗ 错误
name = "a"
name = "b"
✓ 正确
name = "a"
alt_name = "b"

无效的日期时间格式

TOML 的日期时间遵循 RFC 3339。日期需要完整的 4 位年份、2 位月份和 2 位日期;日期时间需要一个 T(或空格)分隔符。格式错误的日期无法解析。

✗ 错误
released = 2026-7-2
✓ 正确
released = 2026-07-02

缺少闭合括号

数组、内联表和表头都必须闭合。未闭合的 [ 或 { 会产生一个解析错误,并指向检测到问题的行和列。

✗ 错误
ports = [8001, 8002
✓ 正确
ports = [8001, 8002]

超出安全范围的整数

TOML 整数是 64 位的,但浏览器中的 JSON 数字限制在 2^53 - 1。超出该范围的数值会在转换时被取整并显示警告。请把非常大的整数存为带引号的字符串以保持精确。

✗ 错误
snowflake = 1420070400000000000
✓ 正确
snowflake = "1420070400000000000"

重新定义表

一旦像 [servers] 这样的表被定义,你就不能用相同的表头再次打开它。若要有多个条目,请改用表数组([[servers]]),它会变成对象的 JSON 数组。

✗ 错误
[servers]
name = "a"
[servers]
name = "b"
✓ 正确
[[servers]]
name = "a"
[[servers]]
name = "b"

常见使用场景

Rust Cargo 元数据
把 Cargo.toml 转换为 JSON,用于构建依赖看板、审计 crate 版本与特性,或把清单数据喂给期望 JSON 而非 TOML 的脚本与 CI。
Python 项目配置
把 pyproject.toml 转换为 JSON,以查看 PEP 621 项目元数据、提取依赖列表,或驱动以编程方式读取打包配置的工具链。
部署配置检查
把 netlify.toml、foundry.toml 或其他平台配置转换为 JSON,用于审查重定向、响应头与构建设置,或为不同平台生成等价配置。
配置格式迁移
在迁移到偏好 JSON 的系统时,把 TOML 应用配置转换为 JSON,或作为用 jq 等 JSON 工具进一步转换前的中间步骤。
静态站点设置
把 Hugo 的 config.toml 转换为 JSON,用于迁移站点设置、跨环境对比配置差异,或构建以 JSON 为后端的设置界面。
API 与脚本输入
把人工编写的 TOML 转成 REST API、无服务器函数或自动化脚本可以直接消费的 JSON,在可读配置与机器输入之间架起桥梁。

技术细节

通过 smol-toml 进行 TOML 1.0.0 解析
TOML 使用 smol-toml 库解析,这是一个零依赖、完全符合 TOML 1.0.0 的解析器。它能正确处理嵌套表、点分键、内联表、表数组、多行字符串以及全部四种日期时间类型,并以行列位置报告解析错误。
无损日期时间与安全整数处理
TOML 日期时间会被序列化为保留其确切种类(带偏移日期时间、本地日期时间、本地日期、本地时间)的 JSON 字符串。超出 JavaScript 安全范围(2^53 - 1)的整数会在解析时提升为 BigInt,然后带着精度警告转换为最接近的 JSON 数字,因此有效的 TOML 永远不会转换失败。
100% 基于浏览器 — 无上传、无服务器
所有处理都在你浏览器的 JavaScript 引擎中进行。任何时刻都不会传输数据。大于 200KB 的输入会从实时切换到手动模式(需显式点击「转换」),以保持界面响应流畅。

最佳实践

把非常大的整数存为字符串
如果你的 TOML 含有超出 2^53 - 1 的整数(Snowflake ID、纳秒时间戳、大型计数器),请在转换前把它们加引号存为字符串。浏览器中的 JSON 数字无法精确保存它们,工具在不得不取整时会提醒你。
JSON 输出优先使用 2 空格缩进
两个空格的缩进是 JSON 使用最广泛的约定,能产生干净、可读、与大多数格式化工具和差异对比工具配合良好的输出。四个空格的缩进留给风格指南要求时再用。
使用前先验证 JSON 输出
转换后,如果你打算手动编辑该 JSON 或把它喂给某个严格的地方,请用我们的 JSON 格式化工具 运行一遍,以确认它有效且格式一致。
单独保留 TOML 注释
JSON 没有注释语法,因此 TOML 的 # 注释在转换时会被丢弃。如果这些注释是重要的文档说明,请在版本控制中把原始 TOML 与生成的 JSON 一并保留。
对重复的段落使用表数组
当你有多个相似的段落(servers、redirects、bins)时,请把它们写成表数组([[section]]),而不是重复 [section]。它们会转换为干净的对象 JSON 数组,而不会引发重复表错误。

常见问题

如何在线将 TOML 转换为 JSON?
把你的 TOML 粘贴到上方输入框。工具会解析它并在浏览器中即刻生成 JSON — 无需点击任何按钮。你可以在「选项」面板中把 JSON 缩进在 2 个空格和 4 个空格之间切换。JSON 出现在输出区后,点击「复制」把它抓到剪贴板,或点击「下载」保存为 .json 文件。一切都在本地运行,因此你的 TOML 绝不会离开你的设备。
什么是 TOML,为什么要把它转换为 JSON?
TOML(Tom's Obvious, Minimal Language,汤姆的显而易见的极简语言)是一种配置文件格式,设计上便于人类读写,其语义清晰、可无歧义地映射为哈希表。它驱动着 Rust 的 Cargo.toml、Python 的 pyproject.toml、Hugo、Netlify 以及许多其他工具。当你需要把配置喂给期望 JSON 的程序或 API、以编程方式查看配置文件、用 JSON 工具对比两份配置,或驱动某个界面时,就会把 TOML 转换为 JSON。TOML 由人来书写,JSON 由机器来消费 — 这个转换器在两者之间架起桥梁。
TOML 的日期和时间在 JSON 中如何表示?
JSON 没有原生的日期类型,因此 TOML 的日期时间会被转换为字符串。本工具会保留 TOML 日期的确切种类:像 1979-05-27T07:32:00Z 这样的带偏移日期时间会变成 "1979-05-27T07:32:00.000Z",像 1979-05-27 这样的本地日期会保持为 "1979-05-27"(不会被补齐为完整时间戳),而像 07:32:00 这样的本地时间会变成 "07:32:00.000"。许多转换器会错误地把本地日期压平成午夜 UTC 时间戳 — 本工具则保留原始含义,让往返转换无损。
这个工具能处理 Cargo.toml 和 pyproject.toml 吗?
可以。Cargo.toml 和 pyproject.toml 是现实中最常见的两种 TOML 文件,两者都获得完整支持,包括嵌套表([dependencies]、[tool.ruff])、内联表(serde = { version = "1.0", features = ["derive"] })以及表数组([[bin]])。加载上方的 Cargo.toml 或 pyproject.toml 示例,即可看到生成的确切 JSON 结构。这对构建看板、依赖审计,或任何以 JSON 读取项目元数据的脚本都很方便。
TOML 的表和表数组是如何转换的?
像 [owner] 这样的 TOML 表头会变成键 "owner" 下的嵌套 JSON 对象。像 [tool.ruff] 这样的点分表会变成嵌套对象:{ "tool": { "ruff": { ... } } }。用双方括号书写的表数组 — 重复的 [[servers]] — 会变成对象的 JSON 数组:{ "servers": [ { ... }, { ... } ] }。内联表({ a = 1, b = 2 })会变成普通 JSON 对象。转换严格遵循 TOML 1.0.0 规范。
把 TOML 转换为 JSON 时,非常大的整数会怎样?
TOML 支持 64 位有符号整数,但 JavaScript(因而浏览器中的 JSON)只能精确表示到 2^53 - 1(9007199254740991)的整数。如果你的 TOML 包含比这更大的整数 — 例如 Snowflake ID 或纳秒时间戳 — 它就无法作为 JSON 数字无损表示,该数值会被取整并显示一条警告。这是浏览器 JavaScript 的根本限制,会影响每一个基于浏览器的转换器。为精确保留这类数值,请在你的 TOML 中把它们保留为带引号的字符串。
我的 TOML 数据会被发送到任何服务器吗?
不会。所有解析与转换都完全在你的浏览器中用 JavaScript 完成。你的 TOML 绝不会被上传、存储或记录。这让本工具可以安全地用于含私有注册表令牌的 Cargo.toml、含内部包索引的 pyproject.toml、含密钥的部署配置,以及任何其他敏感配置。你可以打开浏览器的「网络」标签来验证 — 粘贴 TOML 触发的网络请求为零。
我可以把 JSON 转换回 TOML 吗?
可以。使用配套的 JSON 转 TOML 转换器 进行反向转换,或点击本工具顶部的「交换方向」按钮就地翻转输入与输出。注意 JSON 转 TOML 有几条 TOML 转 JSON 没有的约束 — 顶层必须是对象,且 null 值没有 TOML 等价物 — JSON 转 TOML 工具会为你解释并处理这些情况。
如何在命令行把 TOML 转换为 JSON?
一个流行的选择是基于 Rust 的 CLI 'toml',或 Go 工具 'yj'(yj -tj 读取 TOML 并写出 JSON)。在 Python 3.11+ 中你可以运行:python3 -c "import tomllib, json, sys; print(json.dumps(tomllib.load(sys.stdin.buffer)))" < config.toml。在 Node.js 中:npx smol-toml(或用 smol-toml 库写一个小脚本)。若想在浏览器中快速做一次性转换而不安装任何东西,本工具是最快的途径。
如何在 Python、Rust 或 Node.js 中把 TOML 转换为 JSON?
在 Python 3.11+ 中:import tomllib, json; data = tomllib.load(open('config.toml','rb')); json.dump(data, open('config.json','w'))。在 Rust 中:使用 toml 和 serde_json crate — let value: toml::Value = toml::from_str(&text)?; let json = serde_json::to_string_pretty(&value)?。在 Node.js 中:import { parse } from 'smol-toml'; const data = parse(text); const json = JSON.stringify(data, null, 2) — 这与本工具使用的库和方法相同。
转换器会保留键的顺序吗?注释又如何?
表内的键顺序会被保留:键在 JSON 输出中的出现顺序与它们在你 TOML 中的顺序相同。然而注释会被丢弃 — JSON 没有注释语法,因此 TOML 的 # 注释无法在转换中幸存。如果你需要保留文档说明,请把它作为一个 JSON 友好的字段加入,或在生成的 JSON 旁边保留原始 TOML。
TOML 输入有文件大小限制吗?
没有硬性限制,但超过 200KB 的输入会从实时转换切换到手动模式:会出现一个「转换」按钮,只有点击时才运行转换,以保持浏览器响应流畅。典型的配置文件 — 即便是大型 Cargo.toml 工作区或多环境部署配置 — 转换也远低于 50 毫秒。