我汇总了三种在Jackson中执行动态过滤的方法。其中之一必须满足您的需求。
使用 @JsonView
您可以使用
@JsonView:
public class Views { interface Simple { } interface Detailed extends Simple { } }public class Foo { @JsonView(Views.Simple.class) private String name; @JsonView(Views.Detailed.class) private String details; // Getters and setters}@RequestMapping("/foo")@JsonView(Views.Detailed.class)public Foo getFoo() { Foo foo = new Foo(); return foo;}或者,您可以使用来动态设置视图
MappingJacksonValue。
@RequestMapping("/foo")public MappingJacksonValue getFoo() { Foo foo = new Foo(); MappingJacksonValue result = new MappingJacksonValue(foo); result.setSerializationView(Views.Detailed.class); return result;}用一个 BeanSerializerModifier
您可以扩展
BeanSerializerModifier然后覆盖该
changeProperties()方法。它允许您根据需要添加,删除或替换任何要序列化的属性:
public class CustomSerializerModifier extends BeanSerializerModifier { @Override public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) { // In this method you can add, remove or replace any of passed properties return beanProperties; }}然后将序列化器注册为模块
ObjectMapper:
ObjectMapper mapper = new ObjectMapper();mapper.registerModule(new SimpleModule() { @Override public void setupModule(SetupContext context) { super.setupModule(context); context.addBeanSerializerModifier(new CustomSerializerModifier()); }});使用@JsonFilter
带SimpleBeanPropertyFilter
另一种方法涉及
@JsonFilter:
@JsonFilter("customPropertyFilter")public class Foo { private String name; private String details; // Getters and setters}根据您的需要扩展
SimpleBeanPropertyFilter和覆盖该
serializeAsField()方法:
public class CustomPropertyFilter extends SimpleBeanPropertyFilter { @Override public void serializeAsField(Object pojo, JsonGenerator jgen,SerializerProvider provider, PropertyWriter writer) throws Exception { // Serialize a field // writer.serializeAsField(pojo, jgen, provider, writer); // Omit a field from serialization // writer.serializeAsOmittedField(pojo, jgen, provider); }}然后在您的中注册过滤器
ObjectMapper:
FilterProvider filterProvider = new SimpleFilterProvider() .addFilter("customPropertyFilter", new CustomPropertyFilter());ObjectMapper mapper = new ObjectMapper();mapper.setFilterProvider(filterProvider);如果要将过滤器设置为 “全局”
,即要应用于所有bean,可以创建一个混合类,并使用以下方法对其进行注释
@JsonFilter("customPropertyFilter"):@JsonFilter("customPropertyFilter")public class CustomPropertyFilterMixIn {}然后将混合类绑定到
Object:
mapper.addMixIn(Object.class, CustomPropertyFilterMixIn.class);



