
为什么要在 JSON 和 YAML 之间转换?
JSON(JavaScript Object Notation)和 YAML(YAML Ain't Markup Language)表示相同类型的数据结构,但语法理念截然不同。了解何时以及如何在它们之间进行转换对于现代开发工作流程至关重要。

JSON:API 标准
JSON 专为机器间通信而设计。其语法严格、无歧义,并直接映射到 JavaScript 对象。
{
"name": "John Doe",
"age": 30,
"active": true,
"address": {
"city": "New York",
"country": "US"
},
"hobbies": ["reading", "coding"]
}
JSON 的优势包括:每种编程语言都普遍支持,严格的语法没有歧义,在 JavaScript 中可直接解析,以及压缩后体积小。
JSON 的缺点包括:不支持注释(对于配置文件来说是一个重大限制),以及所有键都需要引号,语法更冗长。
YAML:配置标准
YAML 使用缩进和最少的标点符号来表示相同的结构。它是 DevOps(Docker Compose、Kubernetes、GitHub Actions、Ansible)中配置文件的主要格式。
name: John Doe
age: 30
active: true
address:
city: New York
country: US
hobbies:
- reading
- coding
YAML 的优势包括:支持使用 # 字符注释,嵌套结构更易读,自然的多行字符串,更少的标点符号,以及支持引用和锚点以实现 DRY 配置。
YAML 的缺点包括:对缩进敏感(制表符非法),隐式类型转换导致错误,多种有效表示形式,以及解析速度较慢。
并排比较
| 特性 | JSON | YAML |
|---|---|---|
| 注释 | 否 | 是(# 注释) |
| 尾随逗号 | 不允许 | 不适用 |
| 多行字符串 | 需要 \n 转义 | 自然块样式 |
| 锚点/引用 | 否 | 是(&anchor, *ref) |
| 主要用途 | API、数据交换 | 配置文件 |
| 文件扩展名 | .json | .yaml 或 .yml |

常见 YAML 陷阱
类型转换
YAML 会自动将未加引号的值转换为其自然类型:
port: 8080 # 整数,不是字符串!
enabled: yes # 布尔值 true,不是字符串!
version: 1.0 # 浮点数!
zip: 01234 # 整数(丢弃前导零)!
要强制为字符串,请加引号:port: "8080",zip: "01234"。
挪威问题
在 YAML 1.1 中,国家代码 NO、ON、OFF、YES、NO 被解析为布尔值。YAML 1.2 已修复此问题。

制表符非法
YAML 严格要求使用空格进行缩进。制表符会导致解析错误。
YAML 锚点和别名
YAML 支持使用锚点(&)和别名(*)实现 DRY 原则:
defaults: &defaults
database: postgres
pool: 10
timeout: 30
development:
<<: *defaults
database: sqlite
production:
<<: *defaults
pool: 20
YAML 中的多行字符串
# 字面量块(|)- 保留换行符
description: |
First line
Second line
# 折叠块(>)- 将换行符转换为空格
description: >
This long sentence will
be joined as one line.
JSON 转 YAML 转换规则
| JSON | YAML |
|---|---|
| {} 对象 | 带缩进的键值对 |
| [] 数组 | 以 - 开头的项目 |
| "string" | 不加引号(或根据需要加引号) |
| 123 数字 | 123 |
| true/false | true/false |
| null | null 或 ~ |
-> 试试 JSON 转 YAML 转换器