TOML 解析器

TOML(Tom's Obvious Minimal Language)是一种极简配置文件格式,设计目标是易于读写。它是 Rust(Cargo.toml)、Python 打包(pyproject.toml)以及许多其他现代开发工具的标准配置格式。

规范

常见用例

  • 解析 Cargo.toml 获取 Rust 项目依赖和元数据
  • 读取 pyproject.toml 获取 Python 构建配置(PEP 518/621)
  • 处理 Hugo、Zola 或其他静态站点生成器配置
  • 编辑 Deno 配置文件(deno.toml)
  • 在部署前验证配置

功能

  • 完整支持 TOML v1.0.0 规范
  • 解析表、表数组和嵌套结构
  • 处理内联表和数组
  • 支持日期/时间值
  • 转换为 JSON、YAML 或 XML
  • 语法验证并提供错误消息

示例

Rust Cargo.toml

试试看 →

一个定义包元数据和依赖项的 Cargo 清单。

[package]
name = "my-project"
version = "0.1.0"
edition = "2021"

[dependencies]
serde = { version = "1.0", features = ["derive"] }
tokio = { version = "1", features = ["full"] }

Python pyproject.toml

试试看 →

包含构建系统和元数据的 Python 项目配置。

[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"

[project]
name = "my-package"
version = "1.0.0"
dependencies = ["requests>=2.28"]

提示

  • TOML 使用 = 表示键值对,不同于 YAML 的冒号。
  • 字符串必须用引号括起来。使用 """ 表示多行字符串。
  • 表([table])用于创建嵌套结构。
  • 表数组使用 [[array]] 语法。

理解 TOML 解析器

TOML(Tom's Obvious Minimal Language)是一种旨在无歧义且易于阅读的配置文件格式。由 Tom Preston-Werner(GitHub 联合创始人)创建,TOML 可以干净地映射到哈希表,有意比 YAML 更简单,同时比 INI 文件更具表现力。1.0.0 版本于 2021 年定稿。

TOML 的设计以清晰为中心。键和值使用简单的 "key = value" 语法。表(节)用 [方括号] 表示,创建嵌套结构而无需依赖缩进。表数组使用 [[双方括号]] 来定义重复的节。TOML 原生支持字符串、整数、浮点数、布尔值、日期、时间和日期时间作为一等类型,消除了 JSON 和 YAML 中常见的解析歧义。

Rust 生态系统很早就采用了 TOML,以 Cargo.toml 作为包清单格式。Python 紧随其后推出 pyproject.toml(PEP 518 和 PEP 621),使其成为 setup.py 和 setup.cfg 的现代替代方案。TOML 还出现在 Go 工具、Deno(deno.toml)、Hugo 以及许多其他重视显式、可读配置的开发者工具中。

TOML 用灵活性换取可预测性。与 YAML 不同,每种数据结构只有一种表示方式。没有锚点、没有别名、没有隐式类型转换的意外,也没有有意义的空白字符。代价是深度嵌套的结构会变得冗长,因为每一层都需要自己的表头。

TOML 非常适合人们经常编辑的扁平或中等嵌套的配置文件。其无歧义的语法避免了 YAML 的布尔值强制转换和缩进错误等陷阱,同时比 JSON 更适合配置目的的阅读。TOML 是项目清单(Cargo.toml、pyproject.toml)和工具配置的自然选择。YAML 仍然更适合深度嵌套的结构(如 Kubernetes 清单),而 JSON 是系统间数据交换的标准。

[[双方括号]] 语法创建表数组,每次出现该头部时都会向数组添加一个新元素。例如,[[products]] 出现三次会创建一个包含三个产品对象的数组,每个对象都有按顺序收集的键值对。TOML 还支持使用井号(#)的单行注释,可以出现在独立行上或值之后。没有多行注释语法,但单行注释仍然是相对于完全不支持注释的 JSON 的一个重大优势。

表和内联表服务于不同目的。表使用 [header] 语法并跨越多行,使其在包含多个键的节中具有良好的可读性。内联表在单行中使用花括号(key = { a = 1, b = 2 }),并且必须完全在该行定义——定义后无法扩展。经验法则是,当一个节有两三个以上的键时,使用标准表以提高可读性。

← 返回所有工具