TOML 转 JSON 转换器
在浏览器中粘贴 TOML,即刻得到 JSON。支持 Cargo.toml、pyproject.toml 与 config.toml,日期与嵌套表处理精准,100% 本地运行,无需上传,隐私安全。
选项 · 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
粘贴你的 TOML
在上方输入框中输入或粘贴你的 TOML。你也可以点击「加载示例」来试用真实的 Cargo.toml、pyproject.toml 或部署配置。
- 2
查看实时 JSON 输出
JSON 会即刻出现在输出面板。调整「缩进」选项(2 或 4 个空格)以匹配你的目标格式。日期、表和表数组都会被自动处理。
- 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?
TOML 的日期和时间在 JSON 中如何表示?
这个工具能处理 Cargo.toml 和 pyproject.toml 吗?
TOML 的表和表数组是如何转换的?
把 TOML 转换为 JSON 时,非常大的整数会怎样?
我的 TOML 数据会被发送到任何服务器吗?
我可以把 JSON 转换回 TOML 吗?
如何在命令行把 TOML 转换为 JSON?
如何在 Python、Rust 或 Node.js 中把 TOML 转换为 JSON?
转换器会保留键的顺序吗?注释又如何?
TOML 输入有文件大小限制吗?
相关工具
查看所有工具 →Base64 解码与编码工具
编码和格式化
免费在线 Base64 解码编码工具。实时转换,支持中文和 Emoji,100% 浏览器端运行,数据不离开设备,无需注册。
Base64 转图片转换工具
编码和格式化
在浏览器中把 Base64 字符串或 data URI 解码还原为图片。预览、读取尺寸与 MIME,再下载为 PNG、JPG、GIF、SVG。无需上传。
CSV 转 JSON 转换器
编码和格式化
在浏览器中将 CSV 转换为 JSON。支持 RFC 4180、类型推断、表头行、大整数安全。100% 隐私,无需上传。
.env 转 JSON 转换器
编码和格式化
粘贴 .env 文件,立即得到 JSON。数据库密码、API 密钥和令牌绝不离开你的浏览器 — 100% 本地、零上传、免费的 dotenv 解析器。
免费 HTML 实体解码器 — 解码 HTML
编码和格式化
在线解码 HTML 实体、还原转义后的 HTML——免费、免注册、100% 在浏览器中运行。把命名、十进制和十六进制引用转回字符;绝不上传。
免费 HTML 实体编码器 — 转义 HTML
编码和格式化
在线编码 HTML 实体、转义特殊字符(< > & " ')——免费、免注册、100% 在浏览器中运行。支持命名、十进制或十六进制输出;绝不上传。