如何动态忽略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

回到顶部