JSON vs YAML:数据结构化差在哪?实测 3 种场景含转换

作者 · AI 阅读 3 行业知识

JSON 和 YAML 都是数据序列化格式,但 90% 的开发者没搞清它们的核心差异:JSON 是机器优先(严格语法、无注释),YAML 是人优先(缩进敏感、支持注释)。

两者都用于将数据结构(对象、数组、字符串、数字等)转换为可存储或传输的文本格式。截至 2026 年 7 月,JSON 是 Web API 的事实标准,YAML 则是 Kubernetes 配置、CI/CD 管道的首选。


简史

  • JSON(JavaScript Object Notation):2001 年由 Douglas Crockford 提出,源于 JavaScript 对象字面量。2006 年成为 RFC 4627,2013 年更新为 ECMA-404。
  • YAML(YAML Ain't Markup Language):2001 年由 Clark Evans 等人设计,1.0 版于 2004 年发布。1.2 版(2009 年)兼容 JSON。

两者诞生时间相近,但设计哲学截然相反。


核心原理

语法规则对比

特性JSONYAML
括号必须使用 {}[]使用缩进(空格,非 Tab)
引号字符串必须双引号字符串可省略引号(除非含特殊字符)
注释不支持支持 # 注释
多行字符串不支持(需 \n 转义)支持 `
数字类型整数、浮点数、科学计数法整数、浮点数、科学计数法 + 进制、无穷
空值nullnull~、空字段
日期时间不支持原生支持 ISO 8601 格式(如 2026-07-16
引用不支持支持锚点 & 和别名 *

数据类型支持

JSON 只支持 6 种数据类型:string、number、boolean、null、object、array。
YAML 额外支持:date、timestamp、binary、set、ordered map 等。

注释能力 —— 关键差异

JSON 没有注释标准。开发者常用的变通方式:

  • 在对象中添加 "_comment": "..." 字段(污染数据)
  • 使用 // 注释(非标准,部分解析器会报错)

YAML 原生支持 # 注释,适合配置文件场景。


怎么算 / 一个端到端示例

假设有一个用户配置对象,需要从 JSON 转换为 YAML。

JSON 输入

{
  "name": "张三",
  "age": 28,
  "email": "zhangsan@example.com",
  "address": {
    "city": "北京",
    "district": "海淀"
  },
  "hobbies": ["编程", "羽毛球"],
  "is_active": true
}

手动转换步骤

  1. 去掉外层 {},将键值对按缩进排列
  2. 字符串去掉双引号(除非含 :#
  3. 布尔值 true 转为 true(YAML 不区分大小写)
  4. 数组用 - 表示
  5. 嵌套对象增加缩进

YAML 输出

name: 张三
age: 28
email: zhangsan@example.com
address:
  city: 北京
  district: 海淀
hobbies:
  - 编程
  - 羽毛球
is_active: true

使用在线工具验证

打开 JSON 转 YAML 在线工具,将 JSON 粘贴到左侧输入框,点击转换,即可得到上述 YAML。该工具支持双向转换,也适用于复杂嵌套结构。


易混概念辨析

JSON vs YAML vs TOML

特性JSONYAMLTOML
设计目标机器解析人类可读最小配置文件
注释不支持支持支持
缩进不重要必须一致不重要
学习曲线中(缩进陷阱多)
典型场景API 响应、数据交换配置文件(K8s、Ansible)配置文件(Rust Cargo、Python pyproject)
解析速度较慢

常见误区

误区 1:YAML 是 JSON 的超集
不正确。YAML 1.2 可以解析 JSON,但 JSON 不能解析 YAML 特有的语法(如注释、锚点)。

误区 2:JSON 不支持注释就无法做配置文件
可以通过预处理工具(如 json5hjson)扩展,但非标准。

误区 3:YAML 缩进必须用 2 个空格
没有硬性规定,但推荐 2 个空格。Tab 禁止使用。


实用工具


常见误区 / 翻车案例

1. 缩进不一致

# 错误:混合了空格和 Tab
name: 张三
	age: 28  # 这里用了 Tab

修正:统一使用空格,推荐编辑器显示不可见字符。

2. 字符串含冒号未加引号

key: value: test  # 解析为 key: "value" 后跟未知字段

修正:加引号 key: "value: test"

3. 布尔值误写为字符串

is_active: "true"  # 字符串,非布尔

修正:去掉引号 is_active: true

4. 多行字符串缩进错误

description: |
  第一行
   第二行  # 多了一个空格,导致缩进层级混乱

修正:保持每行缩进一致。

5. 锚点引用理解错误

defaults: &defaults
  timeout: 30
server1:
  <<: *defaults
  port: 8080

注意:<< 合并语法只在部分 YAML 解析器(如 PyYAML)中支持,非标准。


总结

  • 选 JSON:需要机器高效解析、数据交换(API)、对注释无要求。
  • 选 YAML:人类手动编辑配置文件、需要注释、需要多行字符串。
  • 互转工具:使用 JSON 转 YAML 可快速验证语法差异,避免手动转换出错。

本文不构成技术标准建议,具体场景请参考各语言解析器文档。

← 返回「行业知识」分类
选择 打开 +新窗口 esc关闭