jackson和gson均可实现json反序列化:jackson需objectmapper配置注解与typereference处理泛型;gson用gson实例配合typetoken及fieldnamingpolicy;二者均需注意未知字段容错、null值映射及泛型擦除问题。

如果您需要将JSON字符串转换为Java对象,Jackson和Gson是两种主流的反序列化工具。以下是使用这两种库实现JSON对象反序列化的具体方法:
一、使用Jackson进行反序列化
Jackson通过ObjectMapper类提供高性能的JSON解析能力,支持泛型、注解配置及复杂嵌套结构的映射。
1、在项目中引入Jackson核心依赖,如jackson-databind。
2、创建ObjectMapper实例,推荐复用单例对象以避免重复初始化开销。
3、调用readValue(String content, Class
4、若JSON字段名与Java属性名不一致,可在Java类字段上添加@JsonProperty("json_field_name")注解指定映射关系。
5、对于包含时间字段的JSON,需配置ObjectMapper的DateFormat或使用@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")注解。
二、使用Gson进行反序列化
Gson由Google开发,API简洁,对POJO默认命名策略友好,无需额外注解即可完成基础映射。
1、在项目中引入gson依赖。
2、创建Gson实例,可使用new Gson()或通过GsonBuilder定制配置。
3、调用fromJson(String json, Class
4、若JSON键名含下划线而Java字段为驼峰命名,需调用GsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)启用自动转换。
5、针对null值处理,可通过GsonBuilder.serializeNulls()控制序列化行为,反序列化时默认忽略缺失字段。
三、处理泛型集合类型的反序列化
当JSON表示List或Map等参数化类型时,Jackson与Gson均需特殊类型描述符,否则会因类型擦除导致ClassCastException。
1、在Jackson中,使用TypeReference>匿名子类方式传递类型信息,例如:objectMapper.readValue(json, new TypeReference
>() {});
2、在Gson中,使用TypeToken>() {}.getType()获取带泛型的Type对象,再传入fromJson方法。
3、注意:不可直接使用List.class作为参数,必须通过上述方式保留泛型信息。
四、处理未知字段与严格模式
反序列化过程中可能遇到JSON中存在Java类未定义字段的情况,不同库默认行为不同,需显式配置容错策略。
1、Jackson默认抛出UnrecognizedPropertyException,需调用objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)禁用该检查。
2、Gson默认忽略未知字段,如需严格匹配,需自定义InstanceCreator配合ExclusionStrategy,或使用@Expose注解配合GsonBuilder.excludeFieldsWithoutExposeAnnotation()。
3、启用严格模式后,任何未声明字段都会导致反序列化失败。
五、处理空值与缺失字段的映射行为
JSON中字段为null或完全缺失时,Java对象对应属性的赋值结果受库默认策略与注解影响。
1、Jackson默认将JSON null映射为Java null,若字段为基本类型(如int),则触发JsonMappingException;此时应改用包装类型(Integer)。
2、Gson对基本类型字段遇到null时,默认赋予其零值(如int为0),可通过GsonBuilder.registerTypeAdapter(Integer.class, new JsonDeserializer
3、Java字段声明为包装类型是应对JSON null的安全实践。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










