发音
TOML:/ˈtɒməl/(英文),国内一般读作 托姆,全称 Tom’s Obvious, Minimal Language
名字来源:Tom 这个人设计的,Obvious Minimal Language(直白极简语言)。
TOML 用来干什么
配置文件格式,专门用来写项目配置,和 JSON / YAML 同类。
- Rust 的
Cargo.toml(Cargo 项目配置) - Python pyproject.toml
- Golang、Node、Docker、Cloudflare、Terraform 很多工具都支持 TOML
- 目标:人好读、好写,机器容易解析
JSON 适合机器,写注释麻烦;YAML 缩进容易踩坑;TOML 定位就是配置专用。
TOML 核心格式规则
1. 注释
# 单行注释,没有多行注释
# 这是注释
name = "demo"
2. 键值对(基础)
key = value,等号两边空格可选,推荐加空格 值类型:字符串、整数、浮点数、布尔、日期、数组
name = "页面demo" # 字符串必须双引号
age = 26 # int
price = 99.9 # float
enable = true # bool,小写true/false
❗字符串必须双引号;布尔只能小写
true / false,不能 True。
3. 表(Table,[表名]),最常用
分组配置,就是 Cargo.toml 里的 [package]、[dependencies]
[package]
name = "myapp"
version = "0.1.0"
[dependencies]
tokio = "1.0"
特性INITOML分段写法[section][section]注释; / #(看程序)固定#数据类型基本只有字符串string/int/float/bool/ 日期 / 数组嵌套分组不原生支持[a.b.c] 子表数组无原生支持原生数组多行文本很难实现"""..."""多行字符串标准无统一标准,各家实现不一样有完整官方规范
子表:[parent.child]
[database.mysql]
host = "127.0.0.1"
port = 3306
4. 数组 []
数组里同类型,逗号分隔
tags = ["rust", "cargo", "toml"]
nums = [1,2,3]
5. 内联表(一行表){}
person = { name = "chen", age = 30 }
6. 多行字符串(三个双引号)
desc = """
第一行
第二行
"""
⚠️ TOML 坑点(非常重要,写 Cargo.toml 经常踩)
- 大小写敏感:
Name和name是两个不同 key - 字符串单引号是原始字符串,不会转义;双引号会解析
\n、\t
raw = 'c:\test\file' # 不用转义 \
str = "c:\\test\\file" # 双引号要转义
- 数组元素尽量保持同一类型,很多解析器不支持混合类型
- 不能用 tab 缩进,只用空格(现代解析器大多兼容,但规范禁止 tab)
- 不能写重复的
[table],重复定义同一个表会报错
和 JSON / YAML 简单对比
表格
| 格式 | 特点 |
|---|---|
| TOML | 配置文件,结构清晰,支持注释,无缩进陷阱;Cargo/pyproject 首选 |
| JSON | 数据交换,不能注释,适合接口传输 |
| YAML | 缩进驱动,注释支持,缩进错就崩,复杂配置容易出问题 |
TOML 起源就是想改进 INI
TOML 设计初衷就是增强版 INI,长得非常像:都用 [section] 分组、key=value、#注释。 但 INI 能力很弱,TOML 在它基础上做了大量扩展。
外观对比
INI
[package]
name=hello
version=0.1.0
[dependencies]
serde = 1.0
TOML
[package]
name = "hello"
version = "0.1.0"
[dependencies]
serde = "1.0"
总结
| 特性 | INI | TOML |
|---|---|---|
| 分段写法 | [section] | [section] |
| 注释 | ; / #(看程序) | 固定# |
| 数据类型 | 基本只有字符串 | string/int/float/bool/ 日期 / 数组 |
| 嵌套分组 | 不原生支持 | [a.b.c] 子表 |
| 数组 | 无原生支持 | 原生数组 |
| 多行文本 | 很难实现 | """..."""多行字符串 |
| 标准 | 无统一标准,各家实现不一样 | 有完整官方规范 |




