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 數據交換)、可維護性與生態支持來決定使用哪種格式。