YAML 格式化工具
什么是 YAML?
YAML 格式化工具会通过一致的缩进、换行和清晰结构,让 YAML 文件更容易阅读。YAML 常用于 CI 配置、Kubernetes 清单、Docker Compose、静态站点生成器、本地化、OpenAPI 文件和应用设置。与 JSON 不同,YAML 非常依赖缩进、列表标记、冒号、引号、锚点和多行字符串;一个很小的格式错误就可能生成完全不同的结构。这个工具能帮助阅读、整理并发现明显语法问题,但不能替代 Schema 校验或具体工具的规则检查。用于 Kubernetes、GitHub Actions、Ansible 或生产配置时,应在目标系统中实际验证。
使用方法
使用方法
- 在左侧输入框中粘贴或输入 YAML 数据
- 选择与项目代码风格匹配的缩进大小
- 点击「格式化」美化代码,「压缩」减小体积,或「校验」检查语法
- 在右侧查看结果
- 点击「复制」即可复制到剪贴板
选项说明
快捷键
- Ctrl + Enter格式化
- Ctrl + Shift + C复制结果
YAML 提示
- YAML 对缩进敏感,格式化后若要用于 CI、Kubernetes 或部署文件,请检查其中的嵌套列表和映射。
- 尽量根据目标工具的 schema 进行校验;即使 YAML 语法正确,在 GitHub Actions、Docker Compose 或 OpenAPI 中仍可能无效。
使用场景
技术原理
YAML 格式化以 YAML 1.2.2 规范(2021 年 10 月修订版)为基础,该规范正式定义 JSON 为 YAML 的严格子集——任何合法的 JSON 文档都可作为 YAML 解析。解析分为三层:表现层扫描 Unicode 码点并解析字符转义;序列化层构建由标量、序列和映射组成的节点图;原生层应用 YAML Core Schema 将标量强制转换为 `!!str`、`!!int`、`!!float`、`!!bool`、`!!null`、`!!seq`、`!!map` 等类型。常用的运行时库包括 Node 端的 js-yaml 和较新的 `yaml` 包、Python 端的 PyYAML 和 ruamel.yaml、JVM 端的 SnakeYAML。浏览器端格式化器通常通过 js-yaml 的 `load`/`dump` 解析为普通 JS 对象再往返输出。 缩进是核心基础:仅允许 ASCII 空格(U+0020)——规范 §6.1 明确禁止使用制表符(U+0009)进行缩进,这也是从自动转换制表符的代码编辑器中粘贴内容时最常见的解析失败原因。块样式纯粹由列位置决定嵌套关系,因此子节点的缩进必须比父节点多至少一个空格(惯例为两个)。流样式借用 JSON 语法——`[1, 2, 3]` 和 `{a: 1, b: 2}`——可以嵌套在块样式中用于单行表示。块标量使用指示符驱动的折叠:`|`(字面量)精确保留换行,`>`(折叠)将单个换行折叠为空格并保留空行作为段落分隔符,修剪指示符 `-`(去除尾部换行)和 `+`(保留所有尾部换行)附加在指示符后(`|-`、`>+`)。引号规则不同:单引号标量将 `\` 视为字面量,用 `''` 嵌入引号;双引号标量支持 C 风格转义(`\n`、`\t`、`\uXXXX`)。 格式化器通常规范化为一种块样式,并重新发射锚点和别名。锚点 `&name` 标记一个节点;别名 `*name` 引用该节点;合并键 `<<: *name`(YAML 1.1 的遗留特性,大多数解析器仍支持)将另一个映射的键拉入当前映射。多文档流通过 `---` 起始标记和可选的 `...` 结束标记分隔,Kubernetes 使用这种模式在一个清单中包含多个资源。两个已知的陷阱值得安全重新发射:挪威问题——未加引号的标量 `no` 在 YAML 1.1 Schema 下被解释为 `false`(国家代码变成了布尔值)——以及 CVE-2017-18342,PyYAML 的 `yaml.load` 会反序列化任意 Python 对象,改用 `safe_load` 即可修复。这两者都是格式化器应谨慎处理标量解析且永远不执行带标签构造函数的原因。解析时间复杂度为 O(n);大多数基于 AST 的库会丢弃注释,因为注释不属于 YAML 信息模型。
- 规范:YAML 1.2.2(2021 年 10 月)。JSON 是 YAML 1.2 的严格子集,因此任何合法的 JSON 文档都可作为 YAML 解析;常用库包括 js-yaml、`yaml` 包、PyYAML、ruamel.yaml、SnakeYAML。
- 缩进必须使用 ASCII 空格(U+0020);规范 §6.1 禁止使用制表符(U+0009)缩进——这是 `mapping values are not allowed here` 错误最常见的原因。
- 块样式与流样式:块样式使用列位置嵌套(惯例 2 或 4 个空格);流样式使用类似 JSON 的 `[1, 2, 3]` 和 `{a: 1}`。两者可相互嵌套。
- 块标量:`|` 字面量保留换行,`>` 折叠将单个换行折叠为空格;修剪指示符 `-`(去除)和 `+`(保留)附加在指示符后,如 `|-`、`>+`。
- 锚点 `&name` 标记节点,别名 `*name` 引用节点,合并键 `<<: *name` 将另一个映射的键拉入当前映射(YAML 1.1 遗留特性,大多数解析器支持)。
- 多文档流通过 `---`(起始)和可选的 `...`(结束)标记分隔——Kubernetes 使用此模式在一个清单中包含多个资源。
- 已知陷阱:挪威问题(未加引号的 `no`/`yes`/`on`/`off` 在 YAML 1.1 Schema 下被解析为布尔值;YAML 1.2 Core Schema 已修复大部分情况)和 CVE-2017-18342(PyYAML `yaml.load` 任意代码执行;请使用 `safe_load`)。
示例
修复配置文件中错乱的缩进
输入(错乱):
server:
port: 8080
host: localhost
debug: true
格式化后(2 空格缩进):
server:
port: 8080
host: localhost
debug: truedocker-compose.yml 中的服务嵌套列表
version: '3.8'
services:
web:
image: nginx:1.25
ports:
- "80:80"
- "443:443"
depends_on:
- api
api:
image: node:20
environment:
NODE_ENV: productionKubernetes Deployment 清单
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
labels:
app: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
spec:
containers:
- name: web
image: nginx:1.25将 YAML 转为 JSON 接入 jq 流水线
YAML 输入:
user:
id: 42
name: alice
roles:
- admin
- editor
JSON 输出:
{
"user": {
"id": 42,
"name": "alice",
"roles": ["admin", "editor"]
}
}捕捉冒号后缺少空格的错误
输入:
name:alice
age: 30
第 1 行报错:冒号后缺少空格
修复后:
name: alice
age: 30常见问题
YAML 格式化都做了哪些事?
缩进归一化(通常为 2 个空格)、统一引号风格、列表标记对齐,以及把过长的内联集合重新排版为块状形式。实际项目中的 YAML 多为手写,风格容易不一致,格式化工具可将其拉平。
可以把 flow 风格转换为 block 风格吗?
许多版本支持在 flow 风格(类似 JSON 的 {key: value, key2: value2})和 block 风格(多行缩进)之间切换。block 更便于人工编辑,flow 更紧凑。两者间的往返不会改变数据,但外观会变化。
为什么我的引号被改了?
YAML 允许无引号、单引号和双引号字符串,三者有微妙差异。yes/no、true/false、on/off 在不加引号时会被解析为布尔值;不加引号的数字是数字,加引号则是字符串。格式化工具可能会主动加上引号,避免某些值被错误解析。
注释会被保留吗?
多数版本会保留 YAML 注释(#),但其相对 AST 节点的位置可能略有偏移。位于键上方的注释通常仍在上方,行尾注释通常仍跟随原行。建议格式化后重新查看一遍,确认注释位置仍然合理。
YAML 会被上传吗?
不会。解析和格式化通过 js-yaml 等库在浏览器中完成,粘贴的 YAML 不会上传。
为什么 YAML 往返后锚点和别名变了?
YAML 的 &(锚点)和 *(别名)语法允许定义一次值后多次引用。部分格式化工具默认会展开别名,导致去重信息丢失。如果你的工具链依赖锚点,请寻找能保留锚点的选项。
如果我的 YAML 用的是 Tab 缩进怎么办?
YAML 不允许使用 Tab 缩进,必须使用空格。格式化工具通常会将 Tab 转换为空格,或者直接拒绝解析(取决于配置)。如果出现解析错误,请在粘贴前将 Tab 替换为空格。