反序列化时如何实现类似@JsonIgnore的忽略JSON属性的更优方案
Jackson反序列化批量忽略字段的优化方案
方案1:全局配置忽略未知属性(最推荐)
你不需要在实体类中声明任何需要忽略的字段,也不需要加@JsonIgnore注解,只需要给ObjectMapper添加忽略未知属性的配置即可。反序列化时只会映射实体类中存在的字段,所有未声明的字段会自动忽略,嵌套层级的未知字段也会被自动处理,无需额外配置。
代码示例:
import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; // ... ObjectMapper mapper = new ObjectMapper(); // 关闭反序列化时遇到未知属性抛出异常的特性 mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); return mapper.readValue(url, new TypeReference<List<MyClass>>(){});
对应的实体类可以简化为仅保留需要的属性,无需声明任何要忽略的占位字段:
public class MyClass { // 仅保留需要映射的属性 private ClassA objA; private String propE; private String propF; private String propG; private String propH; // 此处省略getter、setter方法 } // ClassA类同样仅保留需要的属性即可,内部的objB、objE等字段会被自动忽略 public class ClassA { private String propA; private String propB; private String propE; private String propF; private String propG; private String propH; // 此处省略getter、setter方法 }
方案2:类上批量指定忽略字段
如果你不想修改全局ObjectMapper配置,可以在实体类上添加@JsonIgnoreProperties注解,批量指定需要忽略的字段,不需要每个字段单独加@JsonIgnore,也不需要声明占位属性。
代码示例:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @JsonIgnoreProperties({"objB", "objD", "objE"}) // 批量指定当前类需要忽略的字段 public class MyClass { private ClassA objA; private String propE; private String propF; private String propG; private String propH; // 此处省略getter、setter方法 } // 嵌套的ClassA类同样可以通过该注解批量忽略内部字段 @JsonIgnoreProperties({"objB", "objE"}) public class ClassA { private String propA; private String propB; private String propE; private String propF; private String propG; private String propH; // 此处省略getter、setter方法 }
方案对比
- 方案1无需修改任何实体类代码,适配所有嵌套层级的字段忽略需求,适合大多数业务场景,代码维护成本最低
- 方案2仅针对指定类生效,可控性更强,适合不需要全局修改ObjectMapper配置的场景
内容的提问来源于stack exchange,提问作者André Ribeiro
相关产品推荐
相关产品推荐

