1. 概述

本文通过简洁实用的示例,深入对比 YAML 和 JSON 两种数据格式的核心差异。作为后端开发,配置文件、接口数据交换、微服务通信等场景中几乎天天和它们打交道。选对格式,能少踩不少坑✅。

2. 格式对比

先看一个简单的 Java POJO:

class Person {
    String name;
    Integer age;
    List<String> hobbies;
    Person manager;
}

JSON 表示

{
    "name":"John Smith",
    "age":26,
    "hobbies":[
        "sports",
        "cooking"
    ],
    "manager":{
        "name":"Jon Doe",
        "age":45,
        "hobbies":[
            "fishing"
        ],
        "manager":null
    }
}

JSON 使用 {}[] 明确表示对象和数组,语法严谨,但对人来说略显冗长。括号嵌套多了容易看花眼❌。

YAML 表示

name: John Smith
age: 26
hobbies:
  - sports
  - cooking
manager:
  name: Jon Doe
  age: 45
  hobbies:
    - fishing
  manager:

YAML 靠缩进表示层级,- 表示列表项。视觉上更清爽,可读性更强✅。
上面的例子:JSON 16 行,YAML 仅 11 行 —— 写配置时,少敲几行代码也是幸福。

3. 文件体积

YAML 行数少,是不是体积也小?不一定⚠️。

考虑一个深度嵌套的结构:

JSON(美化版)

{
    "child":{
        "child":{
            "child":{
                "child":{
                    "child":{
                        "child":{
                            "child":null
                        }
                    }
                }
            }
        }
    }
}

YAML

child:
  child:
    child:
      child:
        child:
          child:
            child:

表面上 YAML 更短,但 JSON 可以压缩成一行:

{"child":{"child":{"child":{"child":{"child":{"child":{"child":null}}}}}}}
  • 压缩后 JSON:74 字节
  • YAML:97 字节

结论:JSON 更紧凑,网络传输更高效。YAML 的可读性是以牺牲空间换来的。

4. YAML 的高级特性

YAML 不只是“好看”,它还提供了 JSON 缺失的实用功能。

4.1. 注释支持 ✅

YAML 支持 # 开头的注释,配置文件里写说明太有必要了:

# 这是用户姓名
name: John
# 年龄,单位:岁
age: 30

而 JSON ❌ 不支持注释。强行加注释会导致解析失败,是个老生常谈的痛点。

4.2. 多行字符串 ✅

YAML 支持 |> 定义多行文本,非常适合写脚本、SQL 或文档:

website: |
  line1
  line2
  line3

等价于 "line1\nline2\nline3\n"。JSON 只能靠 \n 拼接,可读性差。

4.3. 别名与锚点(Aliases & Anchors)✅

YAML 支持通过 & 定义锚点,* 引用,避免重复:

httpPort: 80
httpsPort: &httpsPort 443
defaultPort: *httpsPort

解析后 defaultPort 值为 443。这个特性在复杂配置中非常实用,比如 Spring Boot 的多环境配置。

5. 性能对比

JSON 规范简单,解析快;YAML 功能多,但代价是性能差。

我们用 JMH 做个简单压测,对比解析性能:

@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
@Measurement(batchSize = 10_000, iterations = 5)
@Warmup(batchSize = 10_000, iterations = 5)
@State(Scope.Thread)
class Bench {

    static void main(String[] args) {
        org.openjdk.jmh.Main.main(args);
    }

    @State(Scope.Thread)
    static class YamlState {
        public Yaml yaml = new Yaml();
    }

    @Benchmark
    Object benchmarkYaml(YamlState yamlState) {
        return yamlState.yaml.load("foo: bar");
    }

    @Benchmark
    Object benchmarkJson(Blackhole blackhole) {
        return new JSONObject("{\"foo\": \"bar\"}");
    }
}

测试结果

Benchmark             Mode  Cnt    Score   Error  Units
Main2.benchmarkJson  thrpt   50  644.085 ± 9.962  ops/s
Main2.benchmarkYaml  thrpt   50   20.351 ± 0.312  ops/s

✅ JSON 解析速度是 YAML 的 30 倍左右
在高并发、低延迟场景(如网关、消息解析),选 JSON 更稳妥。

6. 库支持与生态

  • JSON:Web 的事实标准,几乎所有语言原生支持,前端天然解析,生态无敌✅。
  • YAML:主流语言都有库(如 Java 的 SnakeYAML),但实现可能不完全兼容规范,存在兼容性风险⚠️。

简单说:JSON 哪都能跑,YAML 得看有没有靠谱的库。

7. 如何选择?

别纠结,按场景来:

场景 推荐格式 原因
RESTful 接口数据交换 ✅ JSON 前后端通吃,浏览器原生支持
配置文件(如 application.yml ✅ YAML 可读性强,支持注释、多行、锚点
微服务配置中心(如 Nacos) ✅ YAML / JSON 两者都支持,团队习惯优先
高频数据序列化(如 Kafka 消息) ✅ JSON 性能碾压

💡 小贴士:Spring Boot 默认推荐 YAML 写配置,但你完全可以用 application.json 替代,效果一样。

8. 总结

对比项 JSON YAML
可读性 一般 ✅ 极佳
文件体积 ✅ 小 较大
解析性能 ✅ 快(30x)
注释支持
多行字符串
锚点/别名
生态支持 ✅ 全面 良好

一句话决策

  • 要性能、要通用 → 选 JSON
  • 要可读、要维护 → 选 YAML

两者不是替代关系,而是互补。搞清楚各自优势,用对地方才是高级开发的正确姿势✅。


原始标题:Differences Between YAML and JSON