JSON vs YAML:数据结构化差在哪?实测 3 种场景含转换
JSON 和 YAML 都是数据序列化格式,但 90% 的开发者没搞清它们的核心差异:JSON 是机器优先(严格语法、无注释),YAML 是人优先(缩进敏感、支持注释)。
两者都用于将数据结构(对象、数组、字符串、数字等)转换为可存储或传输的文本格式。截至 2026 年 7 月,JSON 是 Web API 的事实标准,YAML 则是 Kubernetes 配置、CI/CD 管道的首选。
简史
- JSON(JavaScript Object Notation):2001 年由 Douglas Crockford 提出,源于 JavaScript 对象字面量。2006 年成为 RFC 4627,2013 年更新为 ECMA-404。
- YAML(YAML Ain't Markup Language):2001 年由 Clark Evans 等人设计,1.0 版于 2004 年发布。1.2 版(2009 年)兼容 JSON。
两者诞生时间相近,但设计哲学截然相反。
核心原理
语法规则对比
| 特性 | JSON | YAML |
|---|---|---|
| 括号 | 必须使用 {} 和 [] | 使用缩进(空格,非 Tab) |
| 引号 | 字符串必须双引号 | 字符串可省略引号(除非含特殊字符) |
| 注释 | 不支持 | 支持 # 注释 |
| 多行字符串 | 不支持(需 \n 转义) | 支持 ` |
| 数字类型 | 整数、浮点数、科学计数法 | 整数、浮点数、科学计数法 + 进制、无穷 |
| 空值 | null | null、~、空字段 |
| 日期时间 | 不支持原生 | 支持 ISO 8601 格式(如 2026-07-16) |
| 引用 | 不支持 | 支持锚点 & 和别名 * |
数据类型支持
JSON 只支持 6 种数据类型:string、number、boolean、null、object、array。
YAML 额外支持:date、timestamp、binary、set、ordered map 等。
注释能力 —— 关键差异
JSON 没有注释标准。开发者常用的变通方式:
- 在对象中添加
"_comment": "..."字段(污染数据) - 使用
//注释(非标准,部分解析器会报错)
YAML 原生支持 # 注释,适合配置文件场景。
怎么算 / 一个端到端示例
假设有一个用户配置对象,需要从 JSON 转换为 YAML。
JSON 输入
{
"name": "张三",
"age": 28,
"email": "zhangsan@example.com",
"address": {
"city": "北京",
"district": "海淀"
},
"hobbies": ["编程", "羽毛球"],
"is_active": true
}
手动转换步骤
- 去掉外层
{},将键值对按缩进排列 - 字符串去掉双引号(除非含
:或#) - 布尔值
true转为true(YAML 不区分大小写) - 数组用
-表示 - 嵌套对象增加缩进
YAML 输出
name: 张三
age: 28
email: zhangsan@example.com
address:
city: 北京
district: 海淀
hobbies:
- 编程
- 羽毛球
is_active: true
使用在线工具验证
打开 JSON 转 YAML 在线工具,将 JSON 粘贴到左侧输入框,点击转换,即可得到上述 YAML。该工具支持双向转换,也适用于复杂嵌套结构。
易混概念辨析
JSON vs YAML vs TOML
| 特性 | JSON | YAML | TOML |
|---|---|---|---|
| 设计目标 | 机器解析 | 人类可读 | 最小配置文件 |
| 注释 | 不支持 | 支持 | 支持 |
| 缩进 | 不重要 | 必须一致 | 不重要 |
| 学习曲线 | 低 | 中(缩进陷阱多) | 低 |
| 典型场景 | API 响应、数据交换 | 配置文件(K8s、Ansible) | 配置文件(Rust Cargo、Python pyproject) |
| 解析速度 | 快 | 较慢 | 快 |
常见误区
误区 1:YAML 是 JSON 的超集
不正确。YAML 1.2 可以解析 JSON,但 JSON 不能解析 YAML 特有的语法(如注释、锚点)。
误区 2:JSON 不支持注释就无法做配置文件
可以通过预处理工具(如 json5、hjson)扩展,但非标准。
误区 3:YAML 缩进必须用 2 个空格
没有硬性规定,但推荐 2 个空格。Tab 禁止使用。
实用工具
- JSON 转 YAML 在线互转:支持批量转换、语法高亮、错误提示,适合开发者日常调试。
- JSON 格式化 / 压缩工具:当你的 JSON 数据需要美化或压缩时,配合使用效果更佳。
常见误区 / 翻车案例
1. 缩进不一致
# 错误:混合了空格和 Tab
name: 张三
age: 28 # 这里用了 Tab
修正:统一使用空格,推荐编辑器显示不可见字符。
2. 字符串含冒号未加引号
key: value: test # 解析为 key: "value" 后跟未知字段
修正:加引号 key: "value: test"。
3. 布尔值误写为字符串
is_active: "true" # 字符串,非布尔
修正:去掉引号 is_active: true。
4. 多行字符串缩进错误
description: |
第一行
第二行 # 多了一个空格,导致缩进层级混乱
修正:保持每行缩进一致。
5. 锚点引用理解错误
defaults: &defaults
timeout: 30
server1:
<<: *defaults
port: 8080
注意:<< 合并语法只在部分 YAML 解析器(如 PyYAML)中支持,非标准。
总结
- 选 JSON:需要机器高效解析、数据交换(API)、对注释无要求。
- 选 YAML:人类手动编辑配置文件、需要注释、需要多行字符串。
- 互转工具:使用 JSON 转 YAML 可快速验证语法差异,避免手动转换出错。
本文不构成技术标准建议,具体场景请参考各语言解析器文档。