跳到主要内容

JSON 转 TOML:把接口数据写成人能读的配置

讲清楚 JSON 转 TOML 怎么做,TOML 是什么、Cargo 和 pyproject 为何用它,嵌套对象如何变成表头,以及它和 YAML 的真实区别,带一段完整转换例子。

发布于 作者 李雷
#JSON #TOML #配置 #格式转换

JSON 转 TOML:把接口数据写成人能读的配置

我手里常有一堆 JSON,接口返回的、后台导出的、脚本拼出来的,可真正要落地的文件却是 TOML。Rust 项目的 Cargo.toml、Python 项目的 pyproject.toml、还有 Hugo 和 Netlify 的站点配置,读的都是 TOML。两边数据其实一模一样,只是标点和排版不同,手动重敲一遍既慢又容易出错,漏个引号或多个逗号,解析器立刻翻脸。

TOML 到底是什么

TOML 是 Tom's Obvious Minimal Language 的缩写,一种为人易读、又能干净映射成哈希表而设计的配置格式。它的语法很克制:一行键值写成 name = "toolora",一个区段标题写成 [database],一个可重复区段写成 [[servers]]。没有花括号,没有满地的逗号,文件能从上往下顺着读下来。

你最常在三个地方碰到它。Rust 的包管理器 Cargo 用 Cargo.toml 描述依赖和元数据,Python 的现代打包标准把工具配置统一塞进 pyproject.toml,很多命令行工具也拿 TOML 当默认配置。它流行的原因很直白:配置是给人手动编辑的,而不是给机器流式传输的,所以读写体验比什么都重要。

表 [table] 和键值是怎么对应的

理解 TOML 的关键,是看懂嵌套对象怎么变成「表」。每个嵌套的 JSON 对象,都会变成一个由点号键路径作标题的 TOML 表。

举个具体的:JSON {"owner": {"name": "Li"}} 会变成一行 [owner] 标题,后面跟着 name = "Li"。再往深一层,{"a": {"b": {"c": 1}}} 会依次输出 [a][a.b],最后才是 c = 1。这里有个排版规矩:同一层级里的标量值要先写,子表后写,因为一个新的表头会结束上一个表的正文,顺序错了输出就不合法。

对象数组又是另一套写法。元素全是对象的数组,会变成「对象表数组」,用双方括号标记。输入 {"servers": [{"host": "a"}, {"host": "b"}]} 生成两个区块,一个 [[servers]]host = "a",第二个 [[servers]]host = "b"。而纯数字或字符串的扁平列表,则保持行内写法,比如 ports = [8001, 8002, 8003],短数据行内更紧凑。

一段完整的转换例子

光说规则不直观,贴一段真实的输入输出。下面这段 JSON:

{
  "package": { "name": "toolora", "version": "1.4.0" },
  "ports": [8001, 8002],
  "servers": [
    { "host": "alpha", "weight": 5 },
    { "host": "beta", "weight": 3 }
  ]
}

转成 TOML 后是这样:

ports = [8001, 8002]

[package]
name = "toolora"
version = "1.4.0"

[[servers]]
host = "alpha"
weight = 5

[[servers]]
host = "beta"
weight = 3

注意三件事:顶层的标量数组 ports 留在最前面当行内数组;package 对象升格成 [package] 表;servers 这个对象数组裂成两个 [[servers]] 区块。还有一点容易踩:TOML 没有 null 字面量,所以值为 null 的键会被直接省略,而不是写成解析不了的 key = null。想保住这个键,得在转换前把 null 换成空字符串或占位值。这些细节你不用记,丢进 JSON 转 TOML 在线工具 直接出结果。

为什么 TOML 比 JSON 更适合人写配置

JSON 适合机器之间传数据,它支持 null,字段名加引号,严格到几乎没有歧义。可一旦让人手动维护配置,那堆花括号和逗号就显得很吵:缩进对不齐、尾逗号报错、改一个值要盯着括号配对。TOML 把这些标点去掉,换成 [section] 标题和裸键值,还内建了日期类型,ISO 日期字符串能被解析器当真正的日期读。代价是它没有 null,面对结构很不规则的深层树也不顺手,但配置文件本来就该是规整的,这个取舍很值。

和 YAML 的区别

很多人会问,既然要给人写,YAML 不也行吗?两者确实都比 JSON 清爽,但路子不同。YAML 靠缩进表达层级,空格数量决定结构,一个 Tab 混进去就可能解析错位,深层嵌套时尤其难数清自己在第几层。TOML 反过来,用显式的 [a.b.c] 表头把路径写死,层级一眼可见,不依赖缩进。所以 Cargo 和 pyproject 选 TOML,要的就是这份确定性:复制一段配置进文件,不会因为缩进被编辑器改动而崩。如果你的目标格式是 YAML,可以走 JSON 转 YAML,反向则用 YAML 转 JSON

说到底,JSON、TOML、YAML 三者只是同一份数据的不同外衣,挑哪件取决于谁来读。机器之间传,JSON;给人手动编辑配置,TOML;这之间的转换交给工具,你省下的是核对括号的眼力。


Made by Toolora · Updated 2026-06-13