
JSON 和 YAML:结构化数据的两种面孔
JSON 和 YAML 都表示相同类型的结构化数据——对象(映射)、数组(列表)、字符串、数字、布尔值和空值——但语法截然不同。理解何时使用每种格式以及如何在它们之间进行转换,是开发者和 DevOps 专业人员的关键技能。

YAML 相对于 JSON 的优势
人类可读性
YAML 使用基于空格的结构,而不是花括号和方括号:
JSON:
{
"server": {
"host": "localhost",
"port": 8080
},
"features": ["auth", "logging", "cache"]
}
YAML:
server:
host: localhost
port: 8080
features:
- auth
- logging
- cache
YAML 版本的特殊字符更少,读起来更像普通英语。
注释
YAML 支持使用 # 的注释,这对于配置文件至关重要:
# 数据库连接设置
database:
host: localhost # 生产环境时更改
port: 5432
# 连接池最大连接数
pool_size: 10
JSON 不支持注释。

多行字符串
YAML 具有优雅的多行字符串语法:
# 字面量块(保留换行符)
message: |
Hello, World!
这是一条多行消息。
# 折叠块(将换行符折叠为空格)
description: >
这个长描述将被
合并为一行。
JSON 相对于 YAML 的优势
- 通用解析器支持:每种语言都内置或轻松获得 JSON 解析器
- 无缩进错误:花括号/方括号是显式的——缩进无关紧要
- 更简单的规范:JSON 规范只有一页;YAML 规范有 80 页
- 无类型歧义:不易出现意外的类型强制转换
- 更适合 API:原生 JavaScript/Web 格式
- 确定性:没有锚点、别名或合并键来混淆简单的解析器
YAML 类型强制转换陷阱
YAML 的自动类型推断可能导致细微的错误:
# 这些在 YAML 中不是字符串:
country: NO # 解析为布尔值 false
version: 1.0 # 解析为浮点数
enabled: true # 布尔值
octal: 0755 # 在 YAML 1.1 中解析为八进制整数
始终将您打算作为字符串的值用引号括起来:
country: "NO"
version: "1.0"

将 JSON 转换为 YAML
对于大多数数据,转换很简单:
- JSON 对象变为 YAML 映射
- JSON 数组变为 YAML 序列
- JSON 字符串变为 YAML 标量(如果简单,通常不带引号)
- JSON 数字和布尔值保持不变
- Null 变为
~或null
YAML 功能无 JSON 对应项
锚点和别名:
defaults: &defaults
timeout: 30
retries: 3
production:
<<: *defaults
host: prod.example.com
转换为 JSON 时,锚点会被解析,值会被内联。
合并键:
base: &base
key: value
extended:
<<: *base
extra: more
JSON 转 YAML 的常见用例
- 将 API 响应转换为 Kubernetes 清单
- 将 JSON 配置转换为 docker-compose.yml
- 从 JSON 数据创建 Ansible playbook
- 将 OpenAPI/Swagger 规范转换为更易读的 YAML
- 从程序化 JSON 生成 Helm chart values
实际示例:Kubernetes 部署
JSON(由工具生成):
{
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": {"name": "my-app"},
"spec": {
"replicas": 3,
"selector": {"matchLabels": {"app": "my-app"}},
"template": {
"metadata": {"labels": {"app": "my-app"}},
"spec": {
"containers": [{"name": "app", "image": "my-app:latest", "ports": [{"containerPort": 8080}]}]
}
}
}
}
YAML(人工维护):
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app
image: my-app:latest
ports:
- containerPort: 8080
YAML 格式是人工维护的 Kubernetes 清单的标准格式。
使用 JSON 转 YAML 转换器
我们的工具:
- 粘贴 JSON 数据——接受任何有效的 JSON
- 即时 YAML 输出——实时转换
- 格式保留——维护数据结构和类型
- 复制 YAML——一键复制,立即使用
- 往返验证——验证 YAML 转换回等效的 JSON
用于配置文件转换、API 文档格式化以及将基于 JSON 的工具与基于 YAML 的基础设施集成。