Java三大JSON库全景对比:Jackson、Fastjson与Gson深度解析_jackson和fastjson
以下为针对Jackson、Fastjson与Gson三大Java JSON库的全方位深度对比解析及实战示例,结合性能测试、安全性评估和场景化选型建议,助您精准匹配项目需求。
🧩 一、核心背景与定位差异
-
Jackson
- 开发团队:FasterXML(社区驱动)
- 生态地位:Spring Boot默认集成库,支持JSON/XML/YAML等多格式
- 设计理念:通过流式API(
JsonParser
/JsonGenerator
)和注解驱动实现高性能处理,适合企业级复杂场景。
-
Fastjson
- 开发团队:阿里巴巴
- 版本演进:
- Fastjson 1.x:已停止维护,存在反序列化RCE等严重漏洞
- Fastjson2:重构版本,修复安全问题并提升性能(性能较1.x提升20%+)
- 核心优势:极致序列化速度,适合高吞吐场景。
-
Gson
- 开发团队:Google
- 定位:轻量易用,零外部依赖,Android开发首选
- 特色:通过
TypeToken
解决泛型擦除问题,支持复杂对象图转换。
⚙️ 二、核心能力对比(关键指标)
@JsonIgnore
、@JsonProperty
等@JSONField
@SerializedName
🔍 深度解析:
- Jackson的流式API 在处理GB级JSON时内存占用仅为Gson的1/3;
- Fastjson2的Path查询 支持类XPath语法,可直接提取嵌套字段(如
JSONPath.eval(json, \"$.user.address\")
);- Gson的宽松映射 允许字段名不匹配、无参构造器缺失,容错性最佳。
🚀 三、性能实测数据(10万次操作)
💡 结论:
- 序列化场景:Fastjson2 > Jackson > Gson
- 反序列化场景:Fastjson2 ≈ Jackson > Gson
🛡️ 四、安全性关键警示
-
Fastjson 1.x:
- 历史漏洞包括AutoType反序列化RCE(如CVE-2022-25845)
- 必须升级至Fastjson2并关闭AutoType:
<dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>2.0.48</version></dependency>
JSON.parseObject(json, User.class, JSONReader.Feature.SupportAutoType); // 禁用AutoType!
-
Jackson防护策略:
启用反序列化未知属性阻断,防止数据注入:spring: jackson: deserialization: FAIL_ON_UNKNOWN_PROPERTIES: true
🎯 五、场景化选型指南
jackson-dataformat-xml
等模块支持YAML/CSV/Protobuf💻 六、实战代码示例
1. Jackson注解驱动序列化
public class User { @JsonIgnore private Long id; // 忽略字段 @JsonProperty(\"user_name\") private String name; @JsonFormat(pattern = \"yyyy/MM/dd\") private Date birth;}ObjectMapper mapper = new ObjectMapper();mapper.registerModule(new JavaTimeModule()); // 支持Java 8时间类型String json = mapper.writeValueAsString(user); // → {\"user_name\":\"Alice\",\"birth\":\"2023/05/20\"}
2. Gson处理泛型与自定义规则
Gson gson = new GsonBuilder() .setDateFormat(\"yyyy-MM-dd\") .excludeFieldsWithoutExposeAnnotation() // 只序列化@Expose注解字段 .create();// 泛型集合反序列化List<User> users = gson.fromJson(json, new TypeToken<List<User>>(){}.getType());
3. Fastjson2安全配置与Path查询
// 禁用AutoType防漏洞String json = JSON.toJSONString(user, JSONWriter.Feature.WriteMapNullValue);User user = JSON.parseObject(json, User.class, JSONReader.Feature.SupportSmartMatch);// JSONPath提取嵌套数据JSONObject data = JSON.parseObject(json);String city = JSONPath.eval(data, \"$.address.city\"); // 直接获取字段
⚠️ 七、避坑指南
-
Jackson日期全局配置:
在Spring Boot中统一设置,避免每个类重复注解:spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8
-
Gson内部类限制:
非静态内部类反序列化会失败,必须声明为static class
。 -
Fastjson2兼容性:
部分1.x API(如JSONArray.parseArray()
)已废弃,需改用JSON.parseArray()
。
💎 终极选型建议
- 企业级应用:Jackson(安全 + 生态 + 多格式支持)
- 性能至上场景:Fastjson2(实测吞吐量 > Jackson 20%)
- 移动端/快速开发:Gson(零配置 + 代码简洁)
在Spring生态中,Jackson仍是“开箱即用”的最优解;而Fastjson2与Gson在特定场景下可作补充。建议通过
JMH
基准测试验证实际业务数据的性能表现。