JSON vs YAML:完整格式比较
JSON 和 YAML 的详细比较。了解何时使用各种格式、转换方法以及配置文件的最佳实践。
Big JSON Team
• Technical WriterExpert in JSON data manipulation, API development, and web technologies. Passionate about creating tools that make developers' lives easier.
# JSON vs YAML:完整格式比较
JSON 和 YAML 是两种流行的数据序列化格式。两者都有优点和缺点,选择取决于您的特定需求。
快速比较
| 特性 | JSON | YAML |
|------|------|------|
| 语法 | 轻量级 | 更简洁 |
| 可读性 | 好 | 优秀 |
| 注释 | ❌ 否 | ✅ 是 |
| 解析速度 | 快 | 较慢 |
| 文件大小 | 较大 | 较小 |
| 引号 | 需要 | 可选 |
| 数据类型 | 4 种 | 丰富 |
| 空格敏感 | 否 | 是 |
语法比较
JSON 格式
{
"姓名": "张三",
"年龄": 30,
"活跃": true,
"标签": ["用户", "管理员"],
"地址": {
"城市": "北京",
"邮编": "100000"
}
}
YAML 格式
姓名: 张三
年龄: 30
活跃: true
标签:
- 用户
- 管理员
地址:
城市: 北京
邮编: "100000"
详细对比
1. 可读性
YAML: 更易读,缩进清晰数据库:
主机: localhost
端口: 5432
用户:
名称: admin
密码: secret
JSON: 需要更多花括号和引号
{
"数据库": {
"主机": "localhost",
"端口": 5432,
"用户": {
"名称": "admin",
"密码": "secret"
}
}
}
2. 引号和字符串
JSON: 必须使用双引号{
"key": "value",
"name": "张三"
}
YAML: 大多数字符串不需要引号
key: value
name: 张三
url: http://example.com
3. 注释
JSON: ❌ 不支持注释 YAML: ✅ 完全支持# 这是注释
数据库:
主机: localhost # 本地开发环境
端口: 5432 # PostgreSQL 默认端口
4. 数据类型
JSON 类型:- 字符串
- 数字
- 布尔值
- null
- 数组
- 对象
- 日期时间
- 时间戳
- 十六进制/八进制数字
- 科学记数法
- 多行字符串
# YAML 特有的类型
日期: 2026-01-14
时间: 14:30:00
十六进制: 0xFF
八进制: 0o755
科学: 1.23e4
多行: |
第一行
第二行
5. 空格敏感性
JSON: ❌ 空格不重要 YAML: ✅ 空格很重要(缩进)# ✓ 正确
列表:
- item1
- item2
# ✗ 错误(缩进不当)
列表:
- item1
- item2
何时使用 JSON
JSON 最适合的场景
- REST API 标准格式
- 浏览器原生支持
- 跨平台兼容
- 原生 JSON 支持
- 无需额外解析库
- 最快的解析速度
- 解析速度更快
- 适合高频数据交换
- 实时应用
- 数据库输出
- 日志文件
- 系统生成的配置
- JSON Schema 验证
- 类型检查
- 强制结构
JSON 示例场景
// API 响应
{
"状态": "成功",
"数据": {
"用户": [
{"id": 1, "name": "张三"},
{"id": 2, "name": "李四"}
]
},
"时间": 1231231232
}
何时使用 YAML
YAML 最适合的场景
- 应用程序配置
- 数据库配置
- 服务器配置
- Docker Compose
- Kubernetes manifests
- CI/CD 配置文件
- 文档化配置
- 说明文字
- 开发人员指南
- 配置由人类编辑
- 需要可读性
- 需要易于修改
- 减少存储空间
- 更紧凑的格式
- 更快的传输
YAML 示例场景
# Docker Compose 配置
version: '3.8'
services:
app:
image: myapp:latest
ports:
- "3000:3000"
environment:
NODE_ENV: production
DATABASE_URL: postgres://db:5432
database:
image: postgres:13
environment:
POSTGRES_PASSWORD: secret
volumes:
- postgres_data:/var/lib/postgresql
性能比较
解析速度
JSON: ████████████████████ 2ms
YAML: ████████ 8ms
XML: ████ 25ms
文件大小
JSON: ████████████████ 1000 字节
YAML: ████████ 500 字节
XML: ████████████████████████ 2000 字节
转换方法
Python:YAML 转 JSON
pip install pyyaml
import json
import yaml
# 读取 YAML
with open('config.yaml', 'r', encoding='utf-8') as f:
data = yaml.safe_load(f)
# 写入 JSON
with open('config.json', 'w', encoding='utf-8') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
Python:JSON 转 YAML
import json
import yaml
# 读取 JSON
with open('config.json', 'r', encoding='utf-8') as f:
data = json.load(f)
# 写入 YAML
with open('config.yaml', 'w', encoding='utf-8') as f:
yaml.dump(data, f, allow_unicode=True, default_flow_style=False)
Node.js:转换
npm install js-yaml
const fs = require('fs');
const yaml = require('js-yaml');
// YAML 转 JSON
const yamlData = fs.readFileSync('config.yaml', 'utf8');
const jsonData = yaml.load(yamlData);
fs.writeFileSync('config.json', JSON.stringify(jsonData, null, 2));
// JSON 转 YAML
const jsonFile = fs.readFileSync('config.json', 'utf8');
const jsonObj = JSON.parse(jsonFile);
const yamlOutput = yaml.dump(jsonObj);
fs.writeFileSync('config.yaml', yamlOutput);
命令行转换
# Python 方式
python3 -c "import json, yaml; print(json.dumps(yaml.safe_load(open('file.yaml')), indent=2))"
# 使用在线工具
# 访问 https://jsonformatter.org 或 bigjson.online
常见陷阱
YAML 空格问题
❌ 错误:
列表:
- item1 # 缩进不正确
- item2
✅ 正确:
列表:
- item1
- item2
YAML 类型推断
# 这些会被解析为其他类型,而不是字符串
值1: on # → true (布尔值)
值2: "on" # → "on" (字符串)
值3: 123 # → 123 (数字)
值4: "123" # → "123" (字符串)
值5: 1.0e2 # → 100.0 (浮点数)
JSON 多行字符串
❌ JSON 不支持多行字符串:
{
"描述": "第一行
第二行"
}
✅ 使用转义字符:
{
"描述": "第一行\n第二行"
}
杂交方法
将 YAML 配置转换为 JSON 常量
# config.yaml
api:
baseUrl: https://api.example.com
timeout: 30000
retries: 3
// 生成的 TypeScript
export const CONFIG = {
api: {
baseUrl: "https://api.example.com",
timeout: 30000,
retries: 3
}
};
使用 JSON Schema 验证 YAML
# 针对 JSON Schema 验证 YAML
ajv validate -s schema.json -d config.yaml --format yaml
项目中的混合使用
推荐做法
| 用途 | 格式 | 原因 |
|------|------|------|
| API 响应 | JSON | Web 标准 |
| 配置文件 | YAML | 可读性 |
| 数据存储 | JSON | 性能 |
| CI/CD | YAML | GitHub/GitLab 标准 |
| 日志 | JSON Lines | 结构化日志 |
转换工具
| 工具 | 用途 | URL |
|------|------|-----|
| Prettier | JSON 格式化 | prettier.io |
| PyYAML | Python YAML | pyyaml.org |
| js-yaml | Node.js YAML | github.com/nodeca/js-yaml |
| Kompose | Docker 转换 | kompose.io |
| JSON Formatter | 在线转换 | jsonformatter.org |
最佳实践
1. 为正确的工作选择正确的格式
- API:JSON
- 配置:YAML
- 数据库:JSON
- 日志:JSON Lines
2. 在配置中添加注释(使用 YAML)
# 生产环境配置
数据库:
# PostgreSQL 连接字符串
url: postgres://prod-db:5432
# 连接池大小
poolSize: 20
3. 验证 YAML 配置
import yaml
def validate_config(filename):
try:
with open(filename) as f:
yaml.safe_load(f)
print("✓ 配置有效")
except yaml.YAMLError as e:
print(f"✗ 配置错误: {e}")
4. 使用 Schema 进行类型检查
# 针对 Schema 验证 YAML
ajv validate -s config.schema.json -d config.yaml
结论
选择 JSON 或 YAML:
- JSON:Web API、JavaScript、速度关键、机器生成
- YAML:配置文件、DevOps、人工维护、可读性关键
两者都是有效的;使用最适合您用例的格式。在同一项目中混合使用两者是可以接受的——选择每个文件的最佳格式。