YAML 校验格式化
YAML 格式化是把缩进乱、行尾带空格的 YAML 按统一缩进重排,排版前先做语法校验的在线工具。粘贴或拖入 docker-compose、k8s 清单这类 .yaml / .yml 即可,缩进可选 2 或 4 空格,也能压缩成单行。语法有错时一次列出全部报错行列;没错时体检 on、no、0755 这类会被读成别的值的坑。只重排空白,注释、锚点与数字原文一字不改;YAML 不上传,免费无需注册。
🔒 YAML 在你的浏览器内处理,未上传任何服务器;美化只统一缩进与空白,注释、锚点与值一个字符不改。
如何使用YAML 校验格式化
YAML 怎么格式化:先在上方文本框粘贴 YAML,或把 .yaml / .yml 文件拖入(浏览器本地处理、YAML 不上传),也可以点「填入示例」先看效果。
默认就是 2 空格美化加隐患体检,无需配置;按需切换缩进宽度、列表是否再缩进一层、按键名排序与重复键策略,点「压缩单行」即可反向压成一行。
有语法错误时看上方的问题列表,点任意一条跳到输入框对应行;没有错误就直接「复制」或「下载 .yaml」,也可「结果送回输入」继续处理。
关于YAML 校验格式化的常见问题
- YAML 格式化会上传我的配置文件吗?
- 不会。YAML 格式化全程在你的浏览器本地完成,YAML 内容不会上传到任何服务器,关闭页面即清除。配置文件里常有数据库连接串、密钥和 token,所以这一点很要紧:本工具只把缩进宽度这类排版偏好写进你本机的 localStorage,YAML 正文与格式化结果一律不落盘(页面只加载站点访问统计脚本,它不读取、也不上报你粘贴的内容)。想自己验证,打开页面后断网再格式化一次,照样出结果。
- 手机上能用 YAML 格式化在线工具吗?
- 可以。本 YAML 格式化在线工具是纯网页实现,手机、平板、电脑浏览器打开即用,无需安装软件,也无需注册登录。手机上做 YAML 排版和电脑上是同一套结果,输入区与结果区在窄屏会上下堆叠而不是并排,结果区支持横向滚动,长行不会被折断破坏缩进;问题列表在小屏可以折叠成「几个错误 / 几个提示」,点开再逐条看。
- YAML 格式化会把注释和锚点弄丢吗?
- 美化模式全部保留:整行与行尾注释、注释之间的空行、锚点 & 与别名 *、合并键 <<、块标量 | 与 > 及其 chomping 指示符、单双引号与裸标量风格、%YAML 指令、--- 与 ... 文档标记都原样输出。多数在线 YAML 格式化走「解析成对象再重新导出」的往返路线,注释一律丢光;本工具走文档语法树重排,注释跟着它原本所属的那个键一起走。只有「压缩单行」会丢注释,界面会明说丢了几条。
- YAML 格式化能定位语法错误在第几行吗?
- 能,而且是一次列出全部错误而不是只报第一个。每条都给出「第 N 行第 M 列」、中文说明、出错那行的原文和修法提示,比如 Tab 缩进会提示「YAML 不允许用 Tab 缩进」,引号没闭合会提示「缺少必需的字符」。点问题列表里的任意一条,输入框就会滚动过去并选中那一行,改完立刻重新校验。语法有错时结果区会保留上次成功的结果并置灰,同时禁用复制与下载。
- YAML 格式化为什么不能用 Tab 缩进?
- 因为 YAML 规范明确禁止用 Tab 作缩进,这不是本工具的限制。Tab 在不同编辑器里的显示宽度不一样,而 YAML 的层级完全由缩进的空格数决定,用 Tab 会让同一份文件在不同人眼里是不同的结构,所以解析器直接判错。本工具遇到 Tab 缩进会报 Tab 相关错误并指出行号,缩进选项也只提供 2 空格和 4 空格两档,不提供 Tab。修法是把行首的 Tab 全部替换成空格再来格式化。
- YAML 格式化后列表缩进变了怎么办?
- 这是「列表再缩进一层」这个开关在起作用,值没有变,两种写法解析出来完全一样。默认开启,key 下面的 - item 会比 key 多缩一层(k8s 官方示例与 GitHub Actions 文档里最常见的写法);在参数区取消勾选,列表项就贴着父键对齐,也就是很多人手写 docker-compose.yml 的习惯。团队仓库里两种风格混着用会让 diff 变得很吵,选定一种再全仓格式化一遍即可。要注意缩进选 4 空格又关掉这个开关时,实测列表项只缩 2 空格而不是不缩进,想要严格的 4 空格对齐就别关它。
- YAML 格式化支持多文档和 k8s 清单吗?
- 支持。用 --- 分隔的多文档(一份 k8s 清单里放 Deployment、Service 多个资源)会被逐份校验、逐份排版再原样拼回去,分隔符与文档级注释保持原位,统计条会告诉你有几份文档。边界要说清楚:这里的 k8s YAML 校验只查 YAML 语法与通用隐患,不做 JSON Schema、CRD 或 k8s API 校验,不会告诉你某个字段在该 apiVersion 下是否合法。
- YAML 格式化能处理多大的文件?有上限吗?
- 单次上限约 2MB,按 UTF-8 字节数计算,常见的 docker-compose.yml、GitHub Actions 工作流、k8s 清单和 i18n 语言包都够用;几十 KB 的文件毫秒级完成,2MB 的极端输入在桌面浏览器上约两秒。超过 200KB 会自动关掉「边输入边排版」,改成参数调好后点按钮再处理,免得每次击键都占住主线程;超过 2MB 会直接提示并拦截,请先拆分。
- YAML 格式化会改写 no、0755 这类值吗?
- 不会改,只会提示。很多格式化工具会把 0755 写成 755、把 9007199254740993 写成末位被改掉的数,因为它们解析成数字后再导出;本工具让数字按原文回吐,值一个字符不动。隐患体检只提示风险:no 和 on 在 YAML 1.1 解析器里是布尔值、0755 会被当八进制、1.10 会掉尾随零、12:30 会被当 60 进制、超安全整数会丢精度、重复键后面覆盖前面。改不改由你决定。
- YAML 格式化在线工具免费吗?需要注册吗?
- 免费,不限次数,不需要注册登录,也没有会员额度或水印。原因很实在:YAML 校验、美化与压缩全跑在你自己的浏览器里,站方没有服务器转换成本,不必靠收费或限量来摊。yml 格式化、yml 在线格式化说的都是同一件事——yml 只是 yaml 的另一种后缀,本工具对 .yaml 和 .yml 一视同仁。想确认 YAML 格式化不上传,打开页面后断网再格式化一次,照样出结果。
- YAML 格式化后中文乱码是怎么回事?
- 多半是文件本身不是 UTF-8 存的。本工具按 UTF-8 读取拖入的 .yaml / .yml,文件若是 GBK、GB2312 编码,读进来就已经是乱码,格式化只会把乱码原样排版。解法是先用编辑器另存为 UTF-8 再拖入,或直接把内容粘进输入框。工具不替你转码;输入带 UTF-8 BOM 时默认去掉并在提示里说明,需要保留可在参数区打开「保留 BOM」。
- YAML 格式化和 YAML 转 JSON 有什么区别?
- YAML 格式化的输入输出都是 YAML,只重排空白、保留注释和锚点,适合把配置文件排整齐后提交;YAML 转 JSON 是格式转换,输出是 JSON,注释必然丢失、锚点与别名会被展开成实际值,适合喂给只认 JSON 的程序。需要转换请用下方的 YAML 转 JSON 或 JSON 转 YAML。也正因为格式化不展开别名,本工具处理别名嵌套很深的 YAML 时毫秒级就出结果。
YAML 格式化到底会改动哪些东西
YAML 在线格式化只重写缩进与行间空白,下面这张保真对照表就是这个 YAML 格式化工具的 完整承诺:左列的东西全部原样保留,唯一会被动的是空白本身。
| YAML 里的内容 | 美化时 | 压缩单行时 |
|---|---|---|
| 整行注释与行尾注释 # | 原样保留,跟着所属的键走 | 全部丢失(会提示丢了几条) |
| 锚点 &、别名 *、合并键 << | 原样保留,不展开别名 | 原样保留,不展开别名 |
| 块标量 | |- |+ > >- |2 | 原样保留,含 chomping 指示符 | 转成等价的双引号字符串 |
| 单引号 / 双引号 / 裸标量风格 | 各自保留,不统一改写 | 按流式写法必要时加引号 |
| 数字原文 0755、1e3、超大整数 | 原样回吐,不解析成数字再导出 | 同样原样回吐 |
| %YAML / %TAG 指令与 --- ... 标记 | 原样保留在原位 | 保留文档结构 |
| 行尾空格、连续多空行、文末换行 | 删除 / 折叠为一个 / 补一个 | 一并去掉 |
| CRLF 换行与 UTF-8 BOM | 统一为 LF,BOM 默认去掉(可选保留) | 同左 |
唯一需要单独说明的是折叠块标量 >:它的换行本来就表示空格,本工具会按折叠语义 把它合成一行(值完全不变),这样反复格式化的结果才稳定,不会来回抖。
YAML 格式化前后对比示例:一份 docker-compose 片段
docker-compose YAML 格式化是最常见的场景,页面里「填入示例」用的就是下面这段缩进乱掉的 compose 片段,它一次踩满了注释、锚点、合并键、单双引号与「挪威问题」五个容易被改坏的点:
# 部署配置:注释与锚点都会原样保留
version: "3.8"
services:
web:
image: nginx:1.25
ports:
- "80:80"
environment:
TZ: 'Asia/Shanghai'
DEBUG: no
db: &base
restart: always
cache:
<<: *base按默认的 2 空格美化后,实测输出是 15 行 / 207 字符 / 12 个键 / 最深 4 层 / 1 条注释 / 1 个锚点 / 1 个别名:
# 部署配置:注释与锚点都会原样保留
version: "3.8"
services:
web:
image: nginx:1.25
ports:
- "80:80"
environment:
TZ: 'Asia/Shanghai'
DEBUG: no
db: &base
restart: always
cache:
<<: *base注意四处细节:顶部注释和它下面那个空行都在原位;&base 与 <<: *base 没有被展开成重复的内容;version 的双引号和 TZ 的单引号各自保留、没被统一;DEBUG: no 一个字符没改,只是被 隐患体检点名了 —— 提示落在第 11 行第 17 列,说的是「裸值 no 在 YAML 1.1 解析器里是布尔值」。
切到压缩模式,同一份内容会被压成 1 行 169 字符,注释在这里必然丢失(界面会明说丢了 1 条):
{version: "3.8", services: {web: {image: nginx:1.25, ports: ["80:80"], environment: {TZ: 'Asia/Shanghai', DEBUG: no}}}, db: &base {restart: always}, cache: {<<: *base}}YAML 校验:6 类「语法没错但会被解析成别的值」的坑
YAML 语法检查在线跑完只是第一步:这 6 条是最容易翻车的地方 —— 语法完全合法,校验也过, 但不同版本的解析器读出来 是不同的值。本工具只检查没加引号的裸标量,所以 "no"、'0755' 这类已经加了引号的写法一条都不会被误报;命中后只提示行列与修法, 绝不替你改值 —— 自动加引号会改变文档语义归属,那是产品红线。
| 规则 | 示例写法 | 会被解析成什么 | 修法 |
|---|---|---|---|
| 布尔陷阱(挪威问题) | DEBUG: no / on: push | YAML 1.1 读成布尔 false / true,1.2 读成字符串 | 加引号:'no' |
| 前导零当八进制 | mode: 0755 | YAML 1.1 读成 493,1.2 读成 755 | 加引号:'0755' |
| 版本号当浮点 | version: 1.10 | 读成 1.1,尾随的 0 丢掉 | 加引号:'1.10' |
| 时间当 60 进制 | start: 12:30 | YAML 1.1 读成 750 | 加引号:'12:30' |
| 超大整数丢精度 | id: 9007199254740993 | 多数解析器按双精度浮点读,末位被改掉 | 加引号存成字符串 |
| 重复键 | a: 1 后面又写 a: 2 | 后写的覆盖先写的,前一个静默消失 | 删掉或改名(默认直接拦下) |
GitHub Actions 的 on: 是这里最经典的案例:它是键而不是值,本工具同样会检查键, 能定位到第 1 行第 1 列。YAML 报错怎么定位在这里是一样的:上方那张问题列表点一下就跳到出错的行。 体检可以在参数区一键关掉。
YAML 列表缩进要不要多缩一层
两种写法都对,解析出来的值一模一样,差别只在观感与团队约定。YAML 允许 - item 与父键同列,也允许再缩一层;本工具默认「列表再缩进一层」,也就是 k8s 清单与 GitHub Actions 工作流里最常见的那种写法,在参数区取消勾选就贴着父键对齐——很多人手写的 docker-compose.yml 正是后一种。
同一段 services 列表,两档缩进宽度下的实测输出如下:
| 开关 | 缩进 2 空格时 | 缩进 4 空格时 |
|---|---|---|
| 勾选(默认) | - web 缩 2 空格,比 services 深一层 | - web 缩 4 空格 |
| 取消勾选 | - web 顶格,与 services 同列 | - web 缩 2 空格(不是顶格) |
# 输入(缩进 2 空格)
services:
- web
- db
# 勾选「列表再缩进一层」(默认)
services:
- web
- db
# 取消勾选
services:
- web
- db有一处容易踩:缩进选 4 空格又取消勾选时,列表项实测落在 2 空格而不是顶格(这是 YAML 输出库对 块列表的处理方式),想让整份文件严格按 4 空格对齐就别关这个开关。同一个仓库里两种风格混用 会让 diff 变得很吵,建议定一种再整份格式化一遍。