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 默认按字段名匹配,大小写敏感。
立即学习“Java免费学习笔记(深入)”;
处理嵌套对象与集合类型
JSON 含数组或嵌套结构时,不能直接用 Class 参数,需借助 TypeReference:
- 反序列化 List:
mapper.readValue(json, new TypeReference<List<User>>() {}) - 反序列化 Map<String, User>:
mapper.readValue(json, new TypeReference<Map<String, User>>() {}) - 嵌套对象(如
{"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<User>>(){}.getType() 传入 fromJson 第二个参数。
不过 Gson 对 Java 8 时间类、复杂泛型推导的支持弱于 Jackson,且不原生集成 Spring MVC 的消息转换器链。


















