乐闻世界logo
搜索文章和话题

YAML 和 JSON 有什么区别?在什么情况下应该选择 YAML 而不是 JSON?

2月21日 14:22

YAML 与 JSON 是两种常用的数据序列化格式,它们各有优缺点。了解它们的区别和选择标准对于开发人员非常重要。

YAML 与 JSON 的基本对比

YAML (YAML Ain't Markup Language)

  • 人类可读的数据序列化格式
  • 使用缩进和空格表示结构
  • 支持注释
  • 支持更丰富的数据类型

JSON (JavaScript Object Notation)

  • 轻量级的数据交换格式
  • 使用大括号和方括号表示结构
  • 不支持注释
  • 数据类型相对简单

语法对比

YAML 示例

yaml
# YAML 配置文件 server: host: localhost port: 8080 ssl: true features: - authentication - logging - monitoring database: type: postgresql host: db.example.com port: 5432 # 连接池配置 pool: min: 5 max: 20

JSON 示例

json
{ "server": { "host": "localhost", "port": 8080, "ssl": true, "features": [ "authentication", "logging", "monitoring" ], "database": { "type": "postgresql", "host": "db.example.com", "port": 5432, "pool": { "min": 5, "max": 20 } } } }

详细对比

1. 可读性

YAML

  • ✅ 更易于人类阅读
  • ✅ 使用缩进表示层次,更直观
  • ✅ 支持注释,便于说明
  • ❌ 缩进错误可能导致解析失败

JSON

  • ✅ 语法严格,不易出错
  • ✅ 结构清晰,易于机器解析
  • ❌ 不支持注释
  • ❌ 大量括号和引号影响可读性

2. 数据类型支持

YAML

yaml
# 丰富的数据类型 string: "Hello World" integer: 42 float: 3.14 boolean: true null: null date: 2024-01-01 binary: !!binary SGVsbG8= multi_line: | This is a multi-line string

JSON

json
{ "string": "Hello World", "integer": 42, "float": 3.14, "boolean": true, "null": null // 不支持日期、二进制等类型 }

3. 注释支持

YAML

yaml
# 这是一个配置文件 server: host: localhost # 服务器地址 port: 8080 # 服务器端口

JSON

json
{ "server": { "host": "localhost", "port": 8080 } // JSON 不支持注释 }

4. 多行字符串

YAML

yaml
# 保留换行符 description: | This is a multi-line string # 折叠换行符 summary: > This is a folded string that becomes one line

JSON

json
{ "description": "This is a\nmulti-line\nstring", "summary": "This is a folded string that becomes one line" }

5. 性能

YAML

  • ❌ 解析速度较慢
  • ❌ 文件体积较大
  • ✅ 适合配置文件

JSON

  • ✅ 解析速度快
  • ✅ 文件体积小
  • ✅ 适合数据交换和 API

6. 兼容性

YAML

  • ✅ YAML 是 JSON 的超集
  • ✅ 所有有效的 JSON 都是有效的 YAML
  • ❌ 某些 YAML 特性不被所有解析器支持

JSON

  • ✅ 广泛支持,几乎所有编程语言都有 JSON 库
  • ✅ Web API 的标准格式
  • ✅ 浏览器原生支持

使用场景

YAML 适合的场景

  1. 配置文件

    yaml
    # Kubernetes 配置 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3
  2. CI/CD 管道

    yaml
    # GitHub Actions name: CI on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2
  3. 文档编写

    yaml
    # API 文档 title: User API version: 1.0.0 endpoints: - path: /users method: GET
  4. 需要注释的配置

    yaml
    # 数据库配置 database: host: localhost # 数据库主机 port: 5432 # 数据库端口

JSON 适合的场景

  1. Web API

    json
    { "users": [ { "id": 1, "name": "John" } ] }
  2. 数据存储

    json
    { "id": 1, "name": "Product", "price": 29.99 }
  3. 配置文件(简单)

    json
    { "port": 8080, "debug": false }
  4. 日志数据

    json
    { "timestamp": "2024-01-01T00:00:00Z", "level": "info", "message": "Server started" }

互操作性

YAML 转 JSON

python
import yaml import json # YAML 字符串 yaml_str = """ name: John age: 30 active: true """ # 转换为 JSON data = yaml.safe_load(yaml_str) json_str = json.dumps(data, indent=2) print(json_str)

JSON 转 YAML

python
import yaml import json # JSON 字符串 json_str = """ { "name": "John", "age": 30, "active": true } """ # 转换为 YAML data = json.loads(json_str) yaml_str = yaml.dump(data, default_flow_style=False) print(yaml_str)

选择标准

选择 YAML 的情况

  1. 需要人类可读和编辑
  2. 配置文件复杂,需要注释
  3. 需要多行字符串
  4. 需要更丰富的数据类型
  5. 配置文件需要版本控制

选择 JSON 的情况

  1. 需要高性能解析
  2. Web API 数据交换
  3. 浏览器环境
  4. 简单的配置文件
  5. 需要最大的兼容性

最佳实践

YAML 最佳实践

  1. 使用一致的缩进

    yaml
    # 推荐:2 个空格缩进 server: host: localhost port: 8080
  2. 添加注释

    yaml
    # 服务器配置 server: host: localhost # 服务器地址 port: 8080 # 服务器端口
  3. 使用引号避免歧义

    yaml
    # 使用引号确保字符串类型 port: "8080"

JSON 最佳实践

  1. 使用一致的格式

    json
    { "name": "John", "age": 30 }
  2. 使用双引号

    json
    { "name": "John" // 必须使用双引号 }
  3. 避免尾随逗号

    json
    { "name": "John", "age": 30 // 不要有尾随逗号 }

性能对比

解析性能

python
import yaml import json import time # 测试数据 data = {"key": "value" * 1000} yaml_str = yaml.dump(data) json_str = json.dumps(data) # YAML 解析 start = time.time() yaml.safe_load(yaml_str) yaml_time = time.time() - start # JSON 解析 start = time.time() json.loads(json_str) json_time = time.time() - start print(f"YAML: {yaml_time:.6f}s") print(f"JSON: {json_time:.6f}s")

总结

特性YAMLJSON
可读性
注释支持
数据类型丰富基础
解析速度
文件大小
浏览器支持
适用场景配置文件API、数据交换

选择 YAML 还是 JSON 取决于具体的使用场景和需求。对于配置文件和需要人类编辑的场景,YAML 是更好的选择;对于 API 和数据交换,JSON 是更合适的选择。

标签:YAML