如何动态忽略Jackson序列化的属性
我有一个具有多个@ManyToOne
关联的实体。我正在使用spring-boot公开REST API。当前,我有多个REST
API,它们返回整个实体(包括关联)的JSON响应。
但是我不想序列化所有REST API中的所有关联对象。
例如
- API-1应该返回parent + associationA对象
- API-2应该返回父对象+ associationA + associationB对象
- API-3应该返回父+关联B +关联C +关联D
因此,在我的序列化过程中,我想忽略除API-1的associationA以外的所有关联。
对于API-2,我想忽略除A和B以外的其他关联
如何在Jackson序列化过程中动态忽略这些属性?
注意:我每个人都使用相同的类;我对为每个API创建DTO都不感兴趣。
任何建议都将受到赞赏。
回答:
我汇总了三种在Jackson中执行动态过滤的方法。其中之一必须满足您的需求。
回答:
您可以使用@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
然后覆盖该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
:
@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);
以上是 如何动态忽略Jackson序列化的属性 的全部内容, 来源链接: utcz.com/qa/428567.html