本文目录
什么是 TOML?
TOML(Tom's Obvious Minimal Language,汤姆的极简明确语言)是一种配置文件格式,其设计宗旨是易读易写。它由 GitHub 联合创始人 Tom Preston-Werner 于 2013 年创立,能够无歧义地映射为哈希表,因此可以直接被解析为任意编程语言中的数据结构。它简洁的语法把人类可读性置于灵活性之上。
YAML 依赖缩进且存在诸多陷阱,JSON 又缺少注释和尾随逗号,而 TOML 则提供了一种折中方案:显式类型(字符串、整数、浮点数、布尔值、日期)、以 [方括号] 表示的清晰表格语法,以及对内联表和数组的支持——同时避免了困扰其他配置格式的种种歧义。
TOML 转 JSON 的工作原理
在 TOML 与 JSON 之间转换,需要先将源格式解析为一个中间数据结构,再将其序列化为目标格式。每种 TOML 类型都能直接映射为对应的 JSON 类型。
- 键值对——TOML 的 key = value 语法映射为 JSON 对象的属性;像 server.port 这样的点分键会变成嵌套对象
- 表和数组——TOML 的 [table] 表头会变成 JSON 对象,[[array-of-tables]] 会变成 JSON 的对象数组,从而保留层级结构
- 类型系统——TOML 的原生类型(字符串、整数、浮点数、布尔值、日期时间)映射为 JSON 基本类型;由于 JSON 没有日期类型,日期时间值会被序列化为 ISO 8601 字符串
免费试用 —— 无需注册
将 TOML 转换为 JSON →TOML 的应用场景
凭借其清晰性和严格性,TOML 已被多个主流生态系统采纳为首选的配置格式。
- Rust 生态——Cargo.toml 是每个 Rust 项目的包清单文件,以一种既便于人工编辑又易于机器解析的格式定义依赖项、构建设置和元数据
- Python 打包——pyproject.toml(PEP 518/621)已成为 Python 项目配置的标准,以更简洁、更具声明式的格式取代了 setup.py 和 setup.cfg
- 静态站点生成器——Hugo 使用 config.toml 进行站点配置,许多其他工具(Deno、InfluxDB、Netlify)也使用 TOML 作为其配置文件格式
常见问题
在配置文件方面,TOML、YAML 和 JSON 有什么区别?
JSON 最为简单,但缺少注释和尾随逗号,因此用于人工编辑的配置文件时显得别扭。YAML 支持注释、视觉上也很清爽,但其基于缩进的语法容易引发隐蔽的 bug(挪威问题、隐式类型转换)。TOML 支持注释、具有显式类型,且不依赖缩进进行解析——因此对于需要人工直接编辑的配置文件而言,它是最安全的选择。
TOML 有哪些局限?
对于层级很深的结构,TOML 可能会变得冗长,因为每一级嵌套都需要各自的 [table.subtable] 表头。它也没有 null 类型(不同于 JSON 和 YAML),这意味着缺失的值只能通过完全省略该键来处理。对于嵌套层级很多的复杂数据,JSON 或 YAML 可能更为紧凑。TOML 更适合扁平到中等嵌套程度的配置,而非层级很深的数据结构。
TOML 如何处理日期和时间?
TOML 对日期和时间类型提供了遵循 RFC 3339 的一等支持:带偏移的日期时间(2024-01-15T10:30:00Z)、本地日期时间(2024-01-15T10:30:00)、本地日期(2024-01-15)以及本地时间(10:30:00)。转换为 JSON 时,由于 JSON 没有原生的日期类型,这些值会被序列化为 ISO 8601 字符串。这种原生的日期支持正是 TOML 相较于 JSON 和 YAML 的优势之一。