YAML 和 JSON 怎么互转?缩进、锚点与常见报错
一、同一份配置的两种写法
server:
host: 127.0.0.1
port: 8080
tags:
- web
- prod
debug: false
这是 7 行、82 个字符的 YAML。等价的 JSON:
{
"server": {
"host": "127.0.0.1",
"port": 8080,
"tags": ["web", "prod"],
"debug": false
}
}
11 行、130 个字符。两者都表示同一个键 5 个、嵌套 3 层的对象结构。
差别在冗余度:YAML 靠缩进和换行表达层次,JSON 靠大括号、中括号和引号。看多了会发现 YAML 省的是括号,代价是对空白字符敏感。
二、什么时候用哪个
| 场景 | 常用格式 | 原因 |
|---|---|---|
| 接口请求与响应 | JSON | 解析器通用、体积小、程序直接读 |
| K8s、Docker Compose、CI 配置 | YAML | 人写得多,缩进比括号直观 |
| 需要写注释的配置 | YAML(或 JSON5/JSONC) | 标准 JSON 不允许注释 |
| 数据文件、日志 | JSON(或 JSON 行) | 一行一条,便于流式处理 |
互转最常见的用途:把 k8s 的 YAML 贴进只吃 JSON 的调试工具,或把接口返回的 JSON 转成 YAML 便于加注释。
三、四类会直接报错的写法
1. Tab 缩进:YAML 规范不允许 Tab 参与缩进,出现就报错(工具返回 BAD_YAML)。这是从编辑器自动缩进、从网页复制时最常见的坑。社区惯例是 2 个空格,但用几个都行,只要同一份文件一致。
2. 锚点与别名:&name 与 *name 表示「引用同一份数据」。JSON 没有引用概念,展开后语义会变(循环引用还会死循环),所以工具直接报不支持而不是给你一个看似正常的结果。
3. 多文档:用 --- 分隔的多份文档也报不支持(首行的 --- 作为起始标记会被忽略)。多文档请拆成多个文件。
4. JSON 尾逗号:{"a":1,} 在标准 JSON 里是语法错误,校验会报「Expected double-quoted property name… position 7」。JSON5、JSONC 允许,但那不是标准 JSON——很多解析器(包括 JSON.parse)会直接拒绝。
另外注意 JSON 不支持注释:写 // 或 /* */ 都会导致校验失败。需要注释就改用 YAML,或把说明放进单独字段(如 _comment)。
四、转换时的类型陷阱
切换格式最容易踩的是类型猜测:
| 写法 | YAML 里的类型 | 提醒 |
|---|---|---|
port: 8080 | 数字 | 正常 |
port: "8080" | 字符串 | 加了引号就是字符串,接口可能报类型错 |
version: 1.10 | 数字 1.1 | 版本号务必加引号,1.10 会被当成 1.1 |
debug: false | 布尔 | 注意不是字符串 "false" |
date: 2026-09-16 | 日期类型 | 各解析器行为不一,需要字符串就加引号 |
版本号(1.10、08)和以 0 开头的编号(0755)一定要加引号,否则转换后数字会变值——这类问题往往在比对配置文件差异时才发现。
五、直接算
→ YAML / JSON 转换器:双向转换,含结构统计与不支持的语法提示
→ JSON 格式化:校验、格式化、压缩,报错定位到行列
→ SQL 格式化:同一类「结构敏感」的文本处理
本站文章为个人使用经验的原创整理,除已注明来源的引用外均为本人撰写。文中涉及的软件名称、商标、截图等归各自权利人所有,引用仅用于说明与交流。如认为本站内容侵犯了你的合法权益,请通过「关于本站」页面的联系方式告知,核实后将及时更正或删除。