java中反序列化json最推荐jackson库,需引入jackson-databind依赖,用objectmapper.readvalue()解析;泛型集合需typereference;字段名不匹配用@jsonproperty,日期处理需javatimemodule,可配置忽略未知字段。

Java 中从 JSON 文本反序列化恢复 Java 对象,最常用、最推荐的方式是使用 Jackson 库(com.fasterxml.jackson.databind.ObjectMapper),它稳定、高效、支持丰富特性(如泛型、注解、日期格式等)。Gson 也是成熟选择,但 Jackson 在 Spring 生态和企业级项目中更主流。
用 Jackson 反序列化基础对象
确保项目已引入 Jackson 依赖(Maven):
<dependency><groupid>com.fasterxml.jackson.core</groupid><artifactid>jackson-databind</artifactid><version>2.15.3</version></dependency>
代码示例:
ObjectMapper mapper = new ObjectMapper();
String json = "{\"name\":\"张三\",\"age\":28}";
User user = mapper.readValue(json, User.class);
注意:User 类需有无参构造器,且字段名(或通过 @JsonProperty 注解)与 JSON key 匹配。Jackson 默认按字段名匹配,大小写敏感。
处理嵌套对象与集合类型
JSON 含数组或嵌套结构时,不能直接用 Class 参数,需借助 TypeReference:
- 反序列化 List:
mapper.readValue(json, new TypeReference<list>>() {})</list> - 反序列化 Map
: mapper.readValue(json, new TypeReference<map user>>() {})</map> - 嵌套对象(如
{"profile": {"city":"北京","score":95}}):只要User类中profile字段类型为对应 POJO(如Profile类),Jackson 会自动递归解析
常见问题与应对建议
-
字段名不一致:在 Java 字段上加
@JsonProperty("user_name")映射 JSON 中的"user_name" -
日期/时间解析失败:配置
ObjectMapper支持标准格式(ISO-8601)或自定义格式:mapper.registerModule(new JavaTimeModule());(Java 8+LocalDateTime等) -
忽略未知字段防止报错:添加配置
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); -
空值或缺失字段设默认值:用
@JsonSetter(nulls = Nulls.SKIP)或字段上加@JsonProperty(defaultValue = "0")(仅基本类型/字符串)
简单替代方案:Gson
若项目已用 Gson,也可快速实现:
Gson gson = new Gson(); User user = gson.fromJson(json, User.class);
对泛型集合需用 TypeToken:new TypeToken<list>>(){}.getType()</list> 传入 fromJson 第二个参数。
不过 Gson 对 Java 8 时间类、复杂泛型推导的支持弱于 Jackson,且不原生集成 Spring MVC 的消息转换器链。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











