Java反序列化JSON推荐Jackson,需注意无参构造、TypeReference处理泛型擦除、JavaType解析嵌套泛型,并配置FAIL_ON_UNKNOWN_PROPERTIES、JavaTimeModule及线程安全。

Java 中从 JSON 字符串反序列化为对象,核心是选对库、写对类型、避开常见坑。最常用的是 Jackson、Gson 和 FastJson,其中 Jackson 因其稳定性和生态支持,目前更推荐用于新项目。
用 Jackson 反序列化单个对象
这是最基础也最常遇到的场景:
- 确保实体类有无参构造方法,字段有 getter/setter(Lombok 的
@Data可自动处理) - 使用
ObjectMapper实例调用readValue(jsonString, TargetClass.class) - 建议关闭未知字段报错:
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
反序列化 List 或集合类型
不能直接写 List<User>.class —— Java 泛型擦除会导致类型丢失,必须用 TypeReference:
- 正确写法:
mapper.readValue(jsonString, new TypeReference<List<User>>() {}) - 工具类中可封装成泛型方法,避免每次重复 new TypeReference
- 如果 JSON 是数组但目标类型写成了单个对象(比如
readValue(json, User.class)),会报 “Can't deserialize JSON array into class” 错误
处理嵌套泛型或动态类型
比如 JSON 对应的是 BaseCommandApiDTO<Order> 这种带运行时确定子类型的泛型,需用 Jackson 的 JavaType 构造:
立即学习“Java免费学习笔记(深入)”;
- 先获取子类 Class:
Class<?> subType = Class.forName("com.example.Order") - 再构建参数化类型:
JavaType type = mapper.getTypeFactory().constructParametricType(BaseCommandApiDTO.class, subType) - 最后反序列化:
mapper.readValue(jsonString, type)
注意事项和避坑点
几个容易忽略但影响稳定性的细节:
- JSON 字段名与 Java 字段名不一致时,用
@JsonProperty("user_name")显式标注 - 日期字段默认可能解析失败,建议注册
JavaTimeModule支持 LocalDateTime 等类型 - 避免在多线程环境下复用未配置为线程安全的 ObjectMapper 实例(Jackson 的 ObjectMapper 是线程安全的,但需确保配置一次性完成)
- Gson 虽简单,但在处理泛型集合或 null 值时行为不如 Jackson 精细;FastJson 曾有安全漏洞,新项目慎用


















