TOML、JSON、YAML 是三种主流配置与数据交换格式,各有优劣:JSON 性能最高,YAML 功能最丰富,TOML 语法最清晰。
格式对比
基本语法示例
JSON:
1
2
3
4
5
| {
"name": "John Doe",
"age": 30,
"hobbies": ["reading", "hiking"]
}
|
YAML:
1
2
3
4
5
| name: John Doe
age: 30
hobbies:
- reading
- hiking
|
TOML:
1
2
3
| name = "John Doe"
age = 30
hobbies = ["reading", "hiking"]
|
数据类型支持
| 类型 | JSON | YAML | TOML |
|---|
| 字符串/数字/布尔/null | ✔️ | ✔️ | ✔️ |
| 数组/对象 | ✔️ | ✔️ | ✔️ |
| 日期时间 | ❌ | ✔️ | ✔️ |
| 多行字符串 | ❌ | ✔️ (| 或 >) | ✔️ (""" 或 ''') |
| 注释 | ❌ | ✔️ (#) | ✔️ (#) |
| 引用/锚点 | ❌ | ✔️ (& 和 *) | ❌ |
语法特性
| 格式 | 特点 |
|---|
| JSON | 键必须加引号、无尾随逗号、无注释、解析最快 |
| YAML | 缩进敏感、支持引用和合并、多文档支持(--- 分隔)、解析最慢 |
| TOML | 明确的键值对语法、[table] 结构、原生日期时间、无缩进问题 |
性能对比
| 指标 | JSON | TOML | YAML |
|---|
| 解析速度 | 最快 | 中等 | 最慢(比 JSON 慢 5-50 倍) |
| 内存占用 | 中等 | 最低 | 最高 |
| 实现复杂度 | 最低 | 中等 | 最高 |
适用场景
| 场景 | 推荐格式 |
|---|
| Web API 数据交换 | JSON |
| 高性能解析需求 | JSON |
| 人类频繁编辑的复杂配置 | YAML |
| Kubernetes 等基础设施配置 | YAML |
| 应用程序配置文件 | TOML |
| 需要日期时间原生支持 | TOML |
| 避免缩进相关错误 | TOML/JSON |
安全考量
| 格式 | 风险 |
|---|
| JSON | JSON 注入、大数字精度问题 |
| YAML | 某些实现可执行任意代码、循环引用 |
| TOML | 相对最安全,无代码执行风险 |
相互转换
1
2
3
4
5
6
7
| import json, yaml, toml
# JSON to YAML
yaml_data = yaml.dump(json.loads(json_str))
# TOML to JSON
json_data = json.dumps(toml.loads(toml_str))
|
最佳实践
| 格式 | 建议 |
|---|
| JSON | 使用 JSON Schema 验证、避免手工编辑 |
| YAML | 使用明确类型标记(!!str)、避免过度复杂的锚点 |
| TOML | 利用表结构组织配置、使用内联表简化结构 |
选择指南
| 需求 | 选择 |
|---|
| 最高性能 | JSON |
| 人类可读性优先 | YAML 或 TOML |
| 简单配置 | TOML |
| 复杂配置 | YAML |
| 需要注释 | YAML 或 TOML |
微服务架构中常见混合使用:JSON 用于服务间通信,YAML 用于复杂配置,TOML 用于应用配置。
Comments