ToolAct工具行动

YAML 格式化工具

输入 YAML
输出结果
行数: 1字符数: 0字节数: 0
行数: 1字符数: 0

什么是 YAML?

YAML 格式化工具会通过一致的缩进、换行和清晰结构,让 YAML 文件更容易阅读。YAML 常用于 CI 配置、Kubernetes 清单、Docker Compose、静态站点生成器、本地化、OpenAPI 文件和应用设置。与 JSON 不同,YAML 非常依赖缩进、列表标记、冒号、引号、锚点和多行字符串;一个很小的格式错误就可能生成完全不同的结构。这个工具能帮助阅读、整理并发现明显语法问题,但不能替代 Schema 校验或具体工具的规则检查。用于 Kubernetes、GitHub Actions、Ansible 或生产配置时,应在目标系统中实际验证。

使用方法

使用方法

  1. 在左侧输入框中粘贴或输入 YAML 数据
  2. 选择与项目代码风格匹配的缩进大小
  3. 点击「格式化」美化代码,「压缩」减小体积,或「校验」检查语法
  4. 在右侧查看结果
  5. 点击「复制」即可复制到剪贴板

选项说明

缩进大小选择 2 个空格或 4 个空格缩进

快捷键

  • Ctrl + Enter格式化
  • Ctrl + Shift + C复制结果

YAML 提示

  • YAML 对缩进敏感,格式化后若要用于 CI、Kubernetes 或部署文件,请检查其中的嵌套列表和映射。
  • 尽量根据目标工具的 schema 进行校验;即使 YAML 语法正确,在 GitHub Actions、Docker Compose 或 OpenAPI 中仍可能无效。

使用场景

提交前规范化简单的 YAML 配置粘贴应用配置、服务器配置、数据库配置、功能开关、日志配置或用户角色定义等 YAML,选择 2 空格或 4 空格缩进进行格式化。工具适用于日常的键值对、嵌套对象、数组、布尔值、数字、null 和引号字符串等结构。
快速发现常见的 YAML 格式错误内置校验器会标记缺少冒号分隔符的行、冒号后缺少必要空格的值,以及在应该使用空格的地方误用了 Tab。这能在文件进入 CI 解析器、部署脚本或文档页面之前,拦截大量复制粘贴和手动编辑造成的错误。解析和校验完全在浏览器中完成,因此包含内部服务名、未发布镜像标签或预发布凭据的草稿清单可以在不上传文件到远程校验器的情况下完成清理。
从杂乱草稿生成整洁的可下载 YAML 文件解析完成后,格式化器会将对象树重写为一致的 YAML 格式,并支持复制或下载 formatted.yaml。它使用轻量解析器而非完整 YAML 引擎,因此锚点、别名、复杂的多行标量、标签和高级 Schema 行为仍需在将使用该文件的运行时环境中验证。
将 YAML 转换为 JSON 供下游流水线使用通过切换按钮将输出格式改为 JSON,同时保留相同的缩进选项,这样 CI 脚本、jq 过滤器或策略检查工具可以直接消费文件而无需额外的解析器。混合类型数组和引号字符串会保持原样,但 YAML 锚点和别名仍会被轻量解析器展平。
在应用前预检 Kubernetes 或 Docker Compose 清单粘贴 deployment.yaml 或 docker-compose.yml,修复校验器标记的格式错误,确认 apiVersion、kind 和 spec 块对齐正确。页面提供快速的阅读和清理步骤,但最终清单仍需通过 `kubectl apply --dry-run=client` 或 `docker compose config` 来发现 Schema 层面的问题。

技术原理

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: true

docker-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: production

Kubernetes 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 替换为空格。