3、配置文件的格式之争:Properties、YAML、JSON、TOML 的对比与选择

说实话,配置文件这事儿,看着简单,选起来真头疼。

我见过不少团队,项目刚开始随便挑了个格式,结果后期维护时叫苦连天。我自己也踩过类似的坑——有一次用 JSON 做配置,结果连个注释都写不了,团队成员每次改配置都得靠猜。

今天咱们就把四种主流格式掰开揉碎,看看它们到底适合什么场景。

3.1 Properties:老牌劲旅,简单粗暴

Properties 文件,Java 出身的老将。格式就是纯粹的键值对:

# 数据库配置
db.host=localhost
db.port=3306
db.username=admin
db.password=secret

# 应用配置
app.name=MyApp
app.version=1.0.0

优点很明显:简单、直观、零学习成本。你想想看,连刚入行的新手都能一眼看懂。

但缺点也致命——不支持层级结构。你想表达一个数据库连接池的配置?对不起,只能靠命名约定:db.pool.maxActive=10。这在复杂场景下简直就是灾难。

适用场景:小型项目、Spring Boot 的 application.properties、简单的键值对需求。

我个人习惯:如果配置项少于 20 个,且没有嵌套结构,Properties 完全够用。别为了用 YAML 而用 YAML。

3.2 YAML:现代项目的宠儿

YAML 现在有多火?你看看 Kubernetes、Docker Compose、GitHub Actions,清一色全是 YAML。

它的核心优势是:可读性极强。用缩进表示层级,看着就像在看文档大纲:

server:
  host: 0.0.0.0
  port: 8080
  ssl:
    enabled: true
    cert: /etc/certs/server.pem

database:
  host: localhost
  port: 5432
  pool:
    maxActive: 10
    minIdle: 2
    timeout: 30000

嗯,这里要注意:YAML 对缩进极其敏感。我曾经因为一个空格没对齐,排查了整整两个小时。说白了,YAML 的「可读性」是用「严格性」换来的。

避坑指南:我曾经在 YAML 里写了一个端口号 0123,结果 YAML 解析器把它当成了八进制数。后来我养成了习惯:所有数字都加引号,或者明确指定类型。

YAML 还支持锚点、别名、多行字符串等高级特性。但我的建议是:别用太花哨的功能。团队里不是每个人都熟悉 YAML 的奇技淫巧。

3.3 JSON:无处不在的通用格式

JSON 不需要我多介绍。前后端通信、API 响应、配置文件……哪儿都有它。

{
  "server": {
    "host": "0.0.0.0",
    "port": 8080,
    "ssl": {
      "enabled": true,
      "cert": "/etc/certs/server.pem"
    }
  },
  "database": {
    "host": "localhost",
    "port": 5432,
    "pool": {
      "maxActive": 10,
      "minIdle": 2,
      "timeout": 30000
    }
  }
}

JSON 最大的优势是:几乎所有语言都有原生解析支持。你不需要额外引入任何库。

但缺点也很明显:不支持注释、语法冗余(大括号、逗号)、手写容易出错。你想想看,让你手写一个 200 行的 JSON 配置文件,你会不会崩溃?

适用场景:需要跨语言共享配置、API 配置、自动化工具配置。

我个人建议:JSON 适合做「机器读写」的配置,不适合做「人工维护」的配置。如果你需要频繁手动修改,换个格式吧。

3.4 TOML:后来居上的优雅方案

TOML 是 Rust 社区推起来的格式,现在 Python 的 pyproject.toml、Cargo 的 Cargo.toml 都在用。

它试图融合 Properties 的简洁和 YAML 的层级表达能力:

[server]
host = "0.0.0.0"
port = 8080

[server.ssl]
enabled = true
cert = "/etc/certs/server.pem"

[database]
host = "localhost"
port = 5432

[database.pool]
maxActive = 10
minIdle = 2
timeout = 30000

TOML 的语法非常清晰:[section] 表示层级,key = value 表示键值对。它支持注释、支持多种数据类型、支持内联表。

我个人习惯:新项目选配置格式时,优先考虑 TOML。它比 YAML 更安全(没有缩进问题),比 JSON 更可读,比 Properties 更强大。

3.5 横向对比:一张表说清楚

特性 Properties YAML JSON TOML
可读性 高(简单场景) 极高
层级支持 差(靠命名约定) 优秀 优秀 优秀
注释支持 支持(#) 支持(#) 不支持 支持(#)
类型安全 差(全是字符串)
学习成本 极低
跨语言支持 极高
适合场景 简单键值对 复杂层级配置 机器间通信 项目配置文件

3.6 我的选择建议

说了这么多,到底怎么选?我总结几条实战经验:

  1. 项目配置文件:优先 TOML。它兼顾了可读性和表达能力,而且没有 YAML 的缩进陷阱。
  2. 容器编排/CI 配置:YAML 是事实标准,没得选。但记得用 lint 工具检查格式。
  3. 跨语言共享配置:JSON。虽然手写体验差,但解析器遍地都是。
  4. 简单场景(少于 20 项):Properties 完全够用,别过度设计。

核心原则:配置文件的格式选择,取决于「谁来维护」和「怎么使用」。人工维护多的,选可读性强的;机器读写多的,选解析方便的。

最后说一句:不管你选哪种格式,一定要写注释。我见过太多项目,配置项的含义全靠猜。你想想看,半年后你自己回来看这些配置,还能记得每个字段是干嘛的吗?

配置文件格式选择决策树 选择配置格式 Properties YAML JSON TOML 简单键值对 容器编排/CI 跨语言共享 项目配置 选择依据:谁来维护?怎么使用? 人工维护多 → 选可读性强的(YAML/TOML) 机器读写多 → 选解析方便的(JSON) 简单场景 → 别过度设计(Properties)

专注资料整理