TOML 格式简介

44 阅读3分钟

TOML(Tom's Obvious, Minimal Language)是为配置文件设计的序列化格式,目标是简洁、可读且易于手写。常用于项目配置(如 Rust 的 Cargo、Python 的 Poetry、各类工具的配置文件)。下面概要说明其特性、示例及与 JSON 的对比,帮助选择合适场景。

核心特点(简要)

  • 面向配置:设计用于人类编辑的配置文件。
  • 支持注释:使用 #
  • 明确的原生类型:字符串、整数、浮点、布尔、日期时间、数组、表(table)。
  • 表与表数组:便于层级组织配置。
  • 可读性高:语法更接近 INI,但类型更丰富。

基本语法示例

toml
# filepath: example.toml
title = "示例配置"
owner = { name = "Alice", dob = 1979-05-27T07:32:00Z }

[database]
server = "192.168.1.1"
ports = [ 8001, 8001, 8002 ]
enabled = true
ratio = 0.75

[[products]]
name = "Hammer"
sku = 738594937

[[products]]
name = "Nail"
sku = 284758393
color = "gray"

对应的 JSON(同语义):

json
{
  "title": "示例配置",
  "owner": { "name": "Alice", "dob": "1979-05-27T07:32:00Z" },
  "database": {
    "server": "192.168.1.1",
    "ports": [8001, 8001, 8002],
    "enabled": true,
    "ratio": 0.75
  },
  "products": [
    { "name": "Hammer", "sku": 738594937 },
    { "name": "Nail", "sku": 284758393, "color": "gray" }
  ]
}

与 JSON 的对比(要点)

  • 可读性
    • TOML:面向人类,允许注释,表结构清晰,适合手动维护配置。
    • JSON:紧凑、标准化但不支持注释(配置场景常被诟病)。
  • 类型与语义
    • TOML:内建 datetime、明确定义整数/浮点/布尔/数组/嵌套表。
    • JSON:基本类型(string/number/boolean/null/array/object),日期通常以字符串表示并需约定格式。
  • 可写性(手工编辑)
    • TOML 更友好(注释、表语法、行内表等)。
  • 生态与工具支持
    • JSON:极其普及,原生支持于多数语言(尤其 JavaScript),适合数据交换和 API。
    • TOML:配置使用广泛,解析器越来越多,但在某些语言/平台的支持不如 JSON 全面。
  • 机器可处理性 / 互操作性
    • JSON 更通用、轻量、网络传输更常用(很多网络协议以 JSON 为默认)。
    • TOML 更适合作为静态配置文件,而非频繁网络交互的序列化格式。
  • 注释与可维护性
    • TOML 支持注释,便于说明配置项;JSON 不支持(需要外部文档或自定义字段)。
  • 严格性与规范
    • TOML 标准严格(v1.0.0),对类型/转义等有明确定义。
    • JSON 标准成熟且广泛实现。

何时使用哪个

  • 选择 TOML:
    • 配置文件需多人手工编辑、希望内置注释和日期类型(例如项目配置、工具配置)。
    • 需要层级清晰的可读配置文件。
  • 选择 JSON:
    • 数据交换(API、前后端通信)、日志或需要广泛兼容性的场景。
    • 需要最广泛的库与语言支持,或嵌入到 JavaScript 环境中。

优点/缺点快速概览

  • TOML 优点:可读性高、支持注释、类型丰富(datetime)、表语法直观。 缺点:生态和解析器不及 JSON 广泛;用于网络传输场景不够普及。
  • JSON 优点:极度普及、格式紧凑、语言原生支持(JS)。 缺点:不支持注释、日期需自定义约定,手写维护时可读性和可注释性较差。

工具与注意事项

  • 常见解析库:各语言均有 TOML 解析器(toml-rs、toml for Python、toml-js 等)。
  • 版本:使用 TOML v1.0+ 时注意解析器是否兼容。
  • 与环境变量/模板结合使用时,配置文件往往需要转换或合并,选择前确定生态支持。

总结:TOML 是面向配置文件的优秀选择(注释友好、类型丰富);JSON 则是数据交换与平台互操作的首选。根据用途(配置 vs 数据交换)、可维护性与生态支持来决定使用哪种格式。