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