YAML 与 JSON 转换工具
YAML → JSON:解析缩进嵌套、`- ` 序列、`[ ]` / `{ }` 流样式、`|` / `>` 块标量,行尾注释自动忽略,输出格式化 JSON;JSON → YAML:按 YAML 规范排版,看起来像数字或布尔的字符串会自动加引号,写回后仍解析为字符串。
YAML 与 JSON 描述的是同一种数据结构,只是写法不同:YAML 靠缩进与短横线表达层级,读起来像清单,是 Kubernetes、CI 流水线、Docker Compose 与各类配置文件的默认格式;JSON 语法严格、易于机器解析,是接口与调试工具的通用格式。两者经常需要来回转换。
转换时的坑集中在三处:缩进 —— YAML 不允许 Tab,层级错一格含义就变了;引号 —— version: 1.0 与 version: "1.0" 一个是数字一个是字符串,本工具在 JSON 转 YAML 时会为看起来像数字或布尔值的字符串自动加引号;特性支持 —— 锚点、别名、自定义标签与多文档需要带状态的解析器,本工具会明确报不支持,而不是给出错误结果。
这个工具解决你的问题了吗?
提交后会把工具名、你的输入与当前结果发送到服务器;请勿填写身份证号、手机号等隐私信息。
AI 助手 会结合你当前的输入与结果回答
追问会再次把当前输入与结果发送到服务器;请勿填写隐私信息。
使用步骤
- 选择方向:YAML → JSON 或 JSON → YAML。
- 粘贴内容后点转换;YAML 侧的行尾注释会自动忽略。
- 转换后核对三处:数字与字符串是否被引号区分、多行块标量 | 与 > 是否保留、布尔值是否被误当字符串。
- 遇到「不支持的语法」提示时,改用支持锚点与别名的本地工具(如 yq),本工具不做静默降级。
计算原理与示例
缩进就是 YAML 的语法
YAML 用缩进表达层级,没有花括号兜底,因此缩进错误会直接改变含义:同一层级必须对齐,子层级必须比父层级更深。本工具按「缩进列」建栈解析,遇到同级就收束上一层,遇到更深就下钻;用 Tab 缩进会直接报错——YAML 规范禁止 Tab 参与缩进,混用空格与 Tab 是配置文件最常见的踩坑点。
块标量:`|` 与 `>` 的区别
`|` 是字面块:块内每个换行都保留,适合放脚本、证书、多行 SQL;`>` 是折叠块:单个换行折叠成空格,只有空行才产生换行,适合放说明性长句。两者都可以加 chomping 修饰:`-` 去掉末尾换行、`+` 保留全部末尾换行、不加则保留一个。
明确不支持的语法
锚点 `&` / 别名 `*` / 标签 `!!str` / 多文档 `---` 分隔都不支持——它们需要有状态的解析器与引用图,本工具的定位是「配置文件的直观互转」,遇到这些语法会明确报「不支持的语法」而不是给出错误的转换结果。
代码示例
Shell 命令行互转(yq)
# YAML → JSON
yq -o=json '.' deploy.yaml > deploy.json
# JSON → YAML
yq -o=yaml '.' deploy.json > deploy.yaml
# 只看某个字段,避免整文件转换
kubectl get deploy myapp -o yaml | yq '.spec.template.spec.containers[].image'
Python 注意用 safe_load
import json, yaml
# 必须用 safe_load:yaml.load 默认可执行标签,存在风险
with open("deploy.yaml", encoding="utf-8") as f:
data = yaml.safe_load(f)
with open("deploy.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
# JSON → YAML:allow_unicode 否则中文会变成转义序列
print(yaml.safe_dump(data, allow_unicode=True, sort_keys=False))
常见问题
YAML 里缩进用几个空格,有硬性规定吗?
没有,同一份文件里保持一致即可,社区惯例是 2 个空格。真正被禁止的是 Tab:YAML 规范不允许 Tab 参与缩进,出现就会报错。如果你的文件是编辑器自动缩进的,建议把该文件设为「空格缩进」。
为什么我复制来的 YAML 提示缩进错误?
多半是从网页或聊天窗口复制时混进了全角空格或不换行空格。本工具只把半角空格当缩进,遇到 Tab 或非半角空白会报错,请先用编辑器把空白字符统一为半角空格再粘贴。
锚点和别名为什么不能转换?
锚点 `&name` 与别名 `*name` 是「引用同一份数据」的语法,展开后会变成对象共享引用,而 JSON 没有引用概念,强行展开会在循环引用时死循环。为避免给你一个看起来正常、实际语义已变的结果,本工具直接报「不支持的语法」。
一个文件里有多个文档(--- 分隔)怎么处理?
首行的 `---` 会被当作文档起始标记忽略;如果正文中间还有 `---`(真正的多文档),会报不支持。多文档场景请拆成多个文件分别转换。
块标量 | 和 > 转换后内容会变吗?
内容不会变,但表现形式会变:进入 JSON 后换行就是普通字符(`\n`),再转回 YAML 时本工具统一用双引号加 `\n` 转义输出,而不是重新猜该用 `|` 还是 `>`——因为折叠块还原成字面块是不等价的,直接输出转义字符串最不容易出错。
值里的井号会被当成注释吗?
只有「行首」或「前面是空白」的 `#` 才是注释,`url: http://x/#a` 这种紧贴内容的 `#` 属于值本身。引号内的 `#` 一律是普通字符。块标量里的 `#` 同样是内容,不会被当成注释。
JSON 转 YAML 时哪些字符串会被加引号?
会「看不出是字符串」的那些:纯数字(`"007"`)、看起来像布尔或空值的词(`"true"`、`"null"`)、含 `: ` 或 ` #` 的、首尾有空白的、空串、以 `-` `?` `#` 等符号开头的。加引号是为了让写回的内容再解析时仍是字符串,不被误读成数字或布尔。
转换过程会把配置内容发到服务器吗?
不会。解析与序列化全部在浏览器内完成,没有任何网络请求,服务端收不到你的配置内容;本工具也不写计算历史,关闭页面即清除。数据库连接串、密钥这类敏感配置可以放心使用。
延伸阅读
来自本站原创文章,讲清这个工具背后的算法与口径。