什么是 TOML 转 JSON?
TOML(Tom's Obvious Minimal Language)是一种专为人类设计的配置文件格式。它能明确无歧义地映射到哈希表,支持嵌套表、类型化值和行内注释。许多工具和框架将 TOML 作为主要配置格式:Rust 项目依赖 Cargo.toml,Python 打包使用 pyproject.toml,Hugo 静态站点通过 config.toml 进行配置。在线将 TOML 转换为 JSON,可以将这些配置文件转换为几乎所有编程语言、API 和数据管道都能原生使用的格式。
JSON(JavaScript Object Notation)由 RFC 8259 定义,是支持最广泛的数据交换格式。TOML 以其简洁的语法和注释支持优先考虑人类可读性,而 JSON 则优先考虑机器互操作性。TOML 转 JSON 转换器通过按照 TOML v1.0.0 规范解析 TOML 输入,并生成结构等价的 JSON 文档来弥合这一差距。转换保留所有数据:字符串、整数、浮点数、布尔值、数组和表均直接映射到对应的 JSON 类型。
TOML 有四种原生日期/时间类型,JSON 无法直接表示:带时区的日期时间、本地日期时间、本地日期和本地时间。由于 JSON 没有日期类型,这些值在转换时会被序列化为 ISO 8601 字符串。
为什么使用 TOML 转 JSON 转换器?
以 TOML 编写的配置文件往往需要输入到仅接受 JSON 的系统中。与其手动重写文件或在本地安装解析库,基于浏览器的转换器能在几秒内完成转换。
TOML 转 JSON 使用场景
TOML 转 JSON 类型映射参考
每种 TOML 类型都有对应的 JSON 等价类型,唯一例外是日期和时间值。下表展示了各 TOML 类型如何转换为 JSON。此映射遵循 TOML v1.0.0 规范,与 tomllib(Python)、toml-rs(Rust)和 @iarna/toml(Node.js)等标准解析器的行为一致。
| 类型 | TOML 语法 | JSON 输出 |
|---|---|---|
| String | "value" | "value" |
| Integer | 42 | 42 |
| Float | 3.14 | 3.14 |
| Boolean | true / false | true / false |
| Offset Date-Time | 1979-05-27T07:32:00Z | "1979-05-27T07:32:00Z" |
| Local Date-Time | 1979-05-27T07:32:00 | "1979-05-27T07:32:00" |
| Local Date | 1979-05-27 | "1979-05-27" |
| Local Time | 07:32:00 | "07:32:00" |
| Array | [1, 2, 3] | [1, 2, 3] |
| Table | [section] | { "section": {} } |
| Inline Table | { key = "val" } | { "key": "val" } |
| Array of Tables | [[items]] | "items": [{}] |
TOML 整数支持下划线提高可读性(如 1_000_000),以及十六进制(0xDEADBEEF)、八进制(0o755)和二进制(0b11010110)字面量。所有这些在 JSON 中均转换为普通十进制数。TOML 还支持无穷大和 NaN 浮点值,但这些值在 JSON 中没有对应表示,在严格模式下会导致转换错误。
代码示例
以下是四种语言中 TOML 转 JSON 转换的可运行示例,每个示例均读取 TOML 文件、解析并输出格式化的 JSON。
import { parse } from '@iarna/toml'
import fs from 'fs'
const toml = fs.readFileSync('config.toml', 'utf8')
const json = parse(toml)
console.log(JSON.stringify(json, null, 2))
// Input: [server]
// host = "localhost"
// port = 8080
// Output: { "server": { "host": "localhost", "port": 8080 } }import tomllib # Python 3.11+ (standard library)
import json
with open('config.toml', 'rb') as f:
data = tomllib.load(f)
print(json.dumps(data, indent=2, default=str))
# Dates become strings: "1979-05-27"
# Arrays of tables become JSON arrays of objectspackage main
import (
"encoding/json"
"fmt"
"os"
"github.com/BurntSushi/toml"
)
func main() {
var data map[string]any
_, err := toml.DecodeFile("config.toml", &data)
if err != nil {
panic(err)
}
out, _ := json.MarshalIndent(data, "", " ")
fmt.Println(string(out))
}# Using yj (YAML/JSON/TOML converter) cat config.toml | yj -tj # Using dasel dasel -f config.toml -r toml -w json # Using Python one-liner (3.11+) python3 -c "import tomllib, json, sys; print(json.dumps(tomllib.load(sys.stdin.buffer), indent=2, default=str))" < config.toml