我想排除值小于零的所有属性。杰克逊有一些现成的解决方案,或者我应该创建CustomSerializerFactory和BeanPropertyWriter吗?
答案 0 :(得分:0)
你可以通过使用一个过滤器来做到这一点 - 它有点冗长,但它完成了这项工作。 首先 - 您需要在实体上指定过滤器:
@JsonFilter("myFilter")
public class MyDtoWithFilter { ...}
然后,您需要指定自定义过滤器,它将查看值:
PropertyFilter theFilter = new SimpleBeanPropertyFilter() {
@Override
public void serializeAsField(Object pojo, JsonGenerator jgen, SerializerProvider provider, PropertyWriter writer) throws Exception {
if (include(writer)) {
if (writer.getName().equals("intValue")) {
int intValue = ((MyDtoWithFilter) pojo).getIntValue();
if (intValue < 0) {
writer.serializeAsField(pojo, jgen, provider);
}
} else {
writer.serializeAsField(pojo, jgen, provider);
}
} else if (!jgen.canOmitFields()) { // since 2.3
writer.serializeAsOmittedField(pojo, jgen, provider);
}
}
@Override
protected boolean include(BeanPropertyWriter writer) {
return true;
}
@Override
protected boolean include(PropertyWriter writer) {
return true;
}
};
这是针对名为intValue
的字段完成的,但您可以对所有需要以类似方式为正的字段执行相同操作。
最后,不是你可以编组一个对象并测试它是否有效:
FilterProvider filters = new SimpleFilterProvider().addFilter("myFilter", theFilter);
MyDtoWithFilter dtoObject = new MyDtoWithFilter();
dtoObject.setIntValue(12);
ObjectMapper mapper = new ObjectMapper();
String dtoAsString = mapper.writer(filters).writeValueAsString(dtoObject);
希望这会有所帮助。