Java 中处理 JSON:Gson vs Jackson vs Fastjson 对比
Java 生态中有三大主流 JSON 库:Gson、Jackson 和 Fastjson。本文从多个维度对比它们的差异,帮你选择最适合的库。
三大 JSON 库简介
Gson(Google)
Google 开发的 JSON 库,以简洁易用著称。
Gson gson = new Gson();
String json = gson.toJson(user);
User user = gson.fromJson(json, User.class);
Jackson(Spring Boot 默认)
功能最强大的 JSON 库,Spring Boot 默认集成。
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user);
User user = mapper.readValue(json, User.class);
Fastjson(阿里巴巴)
阿里巴巴开发的高性能 JSON 库,国内使用广泛。
String json = JSON.toJSONString(user);
User user = JSON.parseObject(json, User.class);
性能对比
对 10 万条数据的序列化/反序列化测试:
| 操作 | Gson | Jackson | Fastjson |
|---|---|---|---|
| 序列化 | 450ms | 280ms | 220ms |
| 反序列化 | 520ms | 310ms | 260ms |
| 内存占用 | 中 | 低 | 低 |
结论:Fastjson 最快,Jackson 次之,Gson 最慢。
功能对比
| 功能 | Gson | Jackson | Fastjson |
|---|---|---|---|
| 注解支持 | ✅ | ✅ | ✅ |
| 自定义序列化 | ✅ | ✅ | ✅ |
| 流式 API | ❌ | ✅ | ✅ |
| JSON Schema | ❌ | ✅ | ❌ |
| 树模型 | ✅ | ✅ | ✅ |
| 日期处理 | 手动 | 自动 | 自动 |
| null 处理 | 可配置 | 可配置 | 可配置 |
安全性对比
Fastjson 安全问题
Fastjson 1.x 存在多个远程代码执行漏洞(CVE),需要:
- 升级到 Fastjson 2.x
- 开启 SafeMode
- 限制反序列化白名单
Jackson 安全问题
Jackson 相对安全,但需要注意:
- 禁用
enableDefaultTyping()(防止反序列化漏洞) - 使用白名单限制反序列化类型
Gson 安全性
Gson 设计简单,没有已知的严重安全漏洞。
选择建议
推荐 Jackson 的场景
- Spring Boot 项目(默认集成)
- 需要复杂 JSON 处理
- 对安全性要求高
- 企业级项目
推荐 Gson 的场景
- 简单的 JSON 处理
- Android 开发
- 追求代码简洁
- 小型项目
推荐 Fastjson 的场景
- 对性能要求极高
- 国内项目(文档多)
- 已有项目使用(升级到 2.x)
最佳实践
// 1. 使用注解控制序列化
public class User {
@JsonProperty("user_name")
private String userName;
@JsonIgnore
private String password;
@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthday;
}
// 2. 全局配置
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 3. 异常处理
try {
User user = mapper.readValue(json, User.class);
} catch (JsonProcessingException e) {
// 处理解析异常
}
总结
对于新项目,推荐使用 Jackson:功能强大、安全可靠、Spring Boot 默认集成。如果是简单场景,Gson 也是不错的选择。Fastjson 2.x 已经修复了安全问题,性能优秀,但生态影响力已不如前。