张芷铭的个人博客

配置文件格式选型:从语法特性、可读性、解析效率、功能完备性四个维度对比 TOML、JSON、YAML、INI。

核心维度对比

特性TOMLJSONYAMLINI
设计定位面向人类的配置语言数据交换格式人类友好的序列化格式简单配置格式
注释支持# 原生支持#/// 原生支持;/# 原生支持
数据类型丰富(字符串/数字/布尔/日期/数组/表)基础(字符串/数字/布尔/数组/对象)极丰富(日期/正则/锚点)极简(仅字符串)
可读性极高中等(括号冗余)高(缩进敏感易出错)低-中
解析效率极高
歧义性有(隐式类型转换)有(无标准规范)
嵌套能力极强

各格式特点

TOML

优势:兼顾可读性和解析效率,类型系统完善,注释友好,结构无歧义。

劣势:相比 INI 稍复杂,生态稍弱于 JSON。

典型库:Python tomlkit、Go github.com/BurntSushi/toml

JSON

优势:语法无歧义,跨语言支持顶级,解析极快,数据交换事实标准。

劣势:无注释,语法冗余,手写体验差。

YAML

优势:语法极简,支持锚点/引用复用配置。

劣势:缩进敏感,隐式类型转换易踩坑(如 yestrue),解析效率低。

INI

优势:语法极简,学习成本为零,解析器极轻量。

劣势:无标准规范,不支持复杂嵌套和强类型。

选型建议

场景推荐格式
项目配置文件(pyproject.tomlCargo.tomlTOML
API 数据交换、前后端通信JSON
复杂复用配置(K8s、Ansible)YAML
嵌入式、极简工具配置INI

实战示例

TOML

1
2
3
4
5
6
7
8
9
# 数据库配置
[database]
server = "192.168.1.1"
port = 5432
enabled = true

[[database.nodes]]
ip = "192.168.1.2"
role = "slave"

JSON

1
2
3
4
5
6
7
8
{
  "database": {
    "server": "192.168.1.1",
    "port": 5432,
    "enabled": true,
    "nodes": [{"ip": "192.168.1.2", "role": "slave"}]
  }
}

YAML

1
2
3
4
5
6
7
database:
  server: 192.168.1.1
  port: 5432
  enabled: true
  nodes:
    - ip: 192.168.1.2
      role: slave

总结

  • 配置场景优先选 TOML
  • 数据交换优先选 JSON
  • 复杂复用配置选 YAML
  • 极简嵌入式场景选 INI

TOML 已成为现代工具链标配(Python/Go/Rust),新手学习 TOML + JSON 可覆盖 90% 场景。

Comments