TOML vs JSON vs YAML vs INI 全方位对比
TOML(Tom’s Obvious, Minimal Language)由 GitHub 联合创始人 Tom Preston-Werner 创建,设计理念:语义直观、语法极简、无歧义映射为哈希表。
基础规则
- 编码:UTF-8
- 注释:
#开头,支持行内注释 - 大小写敏感:
Name和name不同
键值对
键的写法
| 类型 | 示例 | 说明 |
|---|---|---|
| 基本键 | name = "TOML" | 字母、数字、下划线、连字符 |
| 引号键 | "first name" = "Tom" | 包含空格或特殊字符 |
| 点分隔 | author.name = "Tom" | 等价于嵌套表 |
值类型
| 类型 | 示例 |
|---|---|
| 字符串 | str = "hello\nworld" 或 raw = '''不转义''' |
| 整数 | age = 42 或 big = 1_000_000 |
| 浮点数 | pi = 3.14 或 exp = 1e6 |
| 布尔值 | valid = true(仅小写) |
| 日期时间 | dt = 1979-05-27T07:32:00Z(ISO 8601) |
复合类型
数组
numbers = [1, 2, 3]
fruits = ["apple", "banana"]
nested = [[1, 2], [3, 4]] # 元素类型必须一致内联表
author = { name = "Tom", age = 42 }
# 等价于
[author]
name = "Tom"
age = 42表(Tables)
基本表
[database]
server = "192.168.1.1"
port = 5432嵌套表
[database.connection]
timeout = 30数组表
[[users]]
name = "Alice"
age = 25
[[users]]
name = "Bob"
age = 30
# 等价于 JSON: {"users": [{"name": "Alice", "age": 25}, {"name": "Bob", "age": 30}]}多行字符串
# 基本多行(支持转义)
multi = """
hello
world
"""
# 原始多行(不转义)
raw = '''
path: C:\Users\Tom
'''完整示例
title = "项目配置"
version = "1.0.0"
[author]
name = "Tom"
skills = ["coding", "design"]
[database]
server = "192.168.1.1"
port = 5432
[[environments]]
name = "dev"
url = "http://dev.example.com"
[[environments]]
name = "prod"
url = "https://prod.example.com"总结
- 键值对为基础,表组织结构化数据
- 数组元素类型必须一致
- 支持注释、多行字符串、日期时间
- 兼顾人类可读性和机器解析效率