← 返回博客

JSON vs YAML:完整格式比较

JSON 和 YAML 的详细比较。了解何时使用各种格式、转换方法以及配置文件的最佳实践。

Big JSON Team9 分钟阅读comparison
B

Big JSON Team

Technical Writer

Expert in JSON data manipulation, API development, and web technologies. Passionate about creating tools that make developers' lives easier.

9 分钟阅读

# 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 类型(包括 JSON 类型,另加):
  • 日期时间
  • 时间戳
  • 十六进制/八进制数字
  • 科学记数法
  • 多行字符串

# YAML 特有的类型

日期: 2026-01-14

时间: 14:30:00

十六进制: 0xFF

八进制: 0o755

科学: 1.23e4

多行: |

第一行

第二行

5. 空格敏感性

JSON: ❌ 空格不重要 YAML: ✅ 空格很重要(缩进)
# ✓ 正确

列表:

- item1

- item2

# ✗ 错误(缩进不当)

列表:

  • item1
- item2

何时使用 JSON

JSON 最适合的场景

  • Web API
  • - REST API 标准格式

    - 浏览器原生支持

    - 跨平台兼容

  • JavaScript/Node.js
  • - 原生 JSON 支持

    - 无需额外解析库

    - 最快的解析速度

  • 速度关键
  • - 解析速度更快

    - 适合高频数据交换

    - 实时应用

  • 机器生成的数据
  • - 数据库输出

    - 日志文件

    - 系统生成的配置

  • 严格验证
  • - JSON Schema 验证

    - 类型检查

    - 强制结构

    JSON 示例场景

    // API 响应
    

    {

    "状态": "成功",

    "数据": {

    "用户": [

    {"id": 1, "name": "张三"},

    {"id": 2, "name": "李四"}

    ]

    },

    "时间": 1231231232

    }

    何时使用 YAML

    YAML 最适合的场景

  • 配置文件
  • - 应用程序配置

    - 数据库配置

    - 服务器配置

  • DevOps
  • - 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、人工维护、可读性关键

    两者都是有效的;使用最适合您用例的格式。在同一项目中混合使用两者是可以接受的——选择每个文件的最佳格式。

    Share:

    相关文章

    Read in English