Ach*_*ius 7 serialization json jackson spring-boot
我有一个具有多个@ManyToOne关联的实体.我使用spring-boot应用程序来公开REST API.目前我有多个REST API,返回整个实体的json响应,包括关联.
但我不想序列化所有REST API中的所有关联对象.例如
API-1应该返回父+ associationA对象API-2应该返回父+ associationA + associationB对象API-3应该返回父+ associationB + associationc + associationD
因此,在我的序列化过程中,我想忽略除了API-1的associationA之外的所有关联.对于API-2,我想忽略除A和B之外的其他关联
如何在Jackson序列化期间动态忽略这些属性.
注意:我有一个相同的类,我不想为每个API创建任何dto
任何建议都受到王者的赞赏.
cas*_*lin 13
我已经在Jackson中整理了三种方法来执行动态过滤.其中一个必须满足您的需求.
@JsonView你可以使用@JsonView:
public class Views {
interface Simple { }
interface Detailed extends Simple { }
}
Run Code Online (Sandbox Code Playgroud)
public class Foo {
@JsonView(Views.Simple.class)
private String name;
@JsonView(Views.Detailed.class)
private String details;
// Getters and setters
}
Run Code Online (Sandbox Code Playgroud)
@RequestMapping("/foo")
@JsonView(Views.Detailed.class)
public Foo getFoo() {
Foo foo = new Foo();
return foo;
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以动态设置视图MappingJacksonValue.
@RequestMapping("/foo")
public MappingJacksonValue getFoo() {
Foo foo = new Foo();
MappingJacksonValue result = new MappingJacksonValue(foo);
result.setSerializationView(Views.Detailed.class);
return result;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后将序列化程序注册为以下模块ObjectMapper:
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new SimpleModule() {
@Override
public void setupModule(SetupContext context) {
super.setupModule(context);
context.addBeanSerializerModifier(new CustomSerializerModifier());
}
});
Run Code Online (Sandbox Code Playgroud)
@JsonFilter一个SimpleBeanPropertyFilter另一种方法涉及@JsonFilter:
@JsonFilter("customPropertyFilter")
public class Foo {
private String name;
private String details;
// Getters and setters
}
Run Code Online (Sandbox Code Playgroud)
根据您的需要扩展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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后在您的注册中注册过滤器ObjectMapper:
FilterProvider filterProvider = new SimpleFilterProvider()
.addFilter("customPropertyFilter", new CustomPropertyFilter());
ObjectMapper mapper = new ObjectMapper();
mapper.setFilterProvider(filterProvider);
Run Code Online (Sandbox Code Playgroud)
如果你想让你的过滤器"全局",也就是说,要应用于所有bean,你可以创建一个混合类并使用以下方法对其进行注释@JsonFilter("customPropertyFilter"):
@JsonFilter("customPropertyFilter")
public class CustomPropertyFilterMixIn {
}
Run Code Online (Sandbox Code Playgroud)
然后将混合类绑定到Object:
mapper.addMixIn(Object.class, CustomPropertyFilterMixIn.class);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4336 次 |
| 最近记录: |