YAML和TOML都是人类可读的配置格式,但适用场景不同。5个关键区别:
[section]标题。yes/no转换为布尔值。配置文件决定了你的软件在各个环境中的行为方式。YAML 和 TOML 已成为现代开发者工具链的主流格式:Kubernetes 使用 YAML,Rust 的 Cargo 使用 TOML,Python 打包也在 pyproject.toml 中采用了 TOML。本指南涵盖你需要了解的两种格式、它们的常见陷阱,以及如何在两者之间转换数据。
YAML(YAML Ain't Markup Language)用缩进表示层级——没有花括号或方括号。这让它读起来很清爽,但也因对空白错误极其敏感而出了名。
缩进规则:YAML 只使用空格——绝不能用 Tab。同一文档内空格数必须一致(每级 2 或 4 个空格是标准做法)。YAML 文件中任何位置出现一个 Tab 字符都会导致解析错误。
键值对:写作 key: value,冒号后必须有一个空格。漏掉空格(key:value)是常见错误。
字符串:大多数字符串不需要引号。当值包含特殊字符,或可能被误判为布尔值时,才需要加引号。YAML 1.1 会把 yes、no、true、false、on、off 视为布尔值。
多文档 YAML:用 --- 在单个文件中分隔多个文档——这在定义多个资源的 Kubernetes 清单中很常见。
Tab 字符——最常见也最难发现。请配置你的编辑器显示空白字符,并对 YAML 文件强制只用空格。
缩进不一致——在同一文件中混用 2 空格和 4 空格缩进会造成无声的结构错误。使用我们的 YAML 格式化工具,一键规范化缩进。
隐式类型转换——YAML 1.1 把 yes/no/on/off 视为布尔值,把裸数字视为整数或浮点数。端口值 0800 会被解析成八进制的 512。含糊的值请务必加引号。
锚点与别名错误——YAML 的锚点(&name)和别名(*name)功能强大但容易让人困惑。我们的 YAML 转 JSON 工具会解析锚点并展示完全展开后的结果。
TOML(Tom's Obvious Minimal Language)专为人工直接编辑的配置文件而设计。与 YAML 不同,TOML 没有歧义——不会数错缩进,也没有隐式类型转换。
分节:TOML 使用 [section] 标题而非缩进。一个 Cargo.toml 文件包含 [package]、[dependencies] 和 [dev-dependencies] 等小节。
表数组:[[table]] 语法会创建一个对象数组——用于 Cargo.toml 中多个二进制目标之类的场景。
类型:TOML 是强类型的。它区分整数、浮点数、布尔值、字符串、日期时间、数组和内联表。没有隐式转换——port = 8080 永远是整数。
注释:与 JSON 不同,TOML 支持用 # 写注释。这让它非常适合需要在行内说明每项设置的配置文件。
使用 YAML 的场景:工具要求使用它时(Kubernetes、Helm、Ansible、大多数 CI/CD 系统)、需要注释和锚点时,或配置主要由机器读写时。
使用 TOML 的场景:由人工直接编辑文件、正确性比紧凑更重要时。Rust 的 Cargo.toml、Python 的 pyproject.toml 和 Hugo 的 config.toml 都是典型例子。
使用 JSON 的场景:配置由 JavaScript/Node.js 代码消费时(package.json、tsconfig.json),或需要一种解析器支持最广、尽可能简单的格式时。
在这些格式之间转换很简单:我们的 JSON 转 YAML、JSON 转 TOML、YAML 转 JSON 和 TOML 转 JSON 工具都在你的浏览器中完成转换。
最常见的原因是 Tab 与空格的缩进问题。有些编辑器会悄悄插入 Tab。提交前,用我们的 YAML 格式化工具处理一下你的 YAML,把空白规范化。
可以。YAML 用 # 支持注释。从 # 到行尾的所有内容都会被忽略——这是 YAML 作为配置文件相比 JSON 的主要优势之一。
TOML v1.0(2021 年发布)厘清了多行字符串、Unicode 键名和日期时间格式等边界情况。大多数现代工具(Cargo 1.54+、Python 的 tomllib)使用 v1.0。我们的格式化工具符合 v1.0 规范。
使用我们的 YAML 转 JSON 工具。粘贴你的清单并点击「转换」。输出是 kubectl 和大多数 Kubernetes 客户端都接受的有效 JSON。
Python 打包社区选择 TOML,是因为它支持注释(不像 JSON)、没有歧义(不像 YAML 的隐式类型),且对人友好。PEP 518(2016 年)为此指定了 TOML。