杰克逊,如何忽略一些价值观

时间:2013-12-16 16:58:05

标签: jackson

我想排除值小于零的所有属性。杰克逊有一些现成的解决方案,或者我应该创建CustomSerializerFactory和BeanPropertyWriter吗?

1 个答案:

答案 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);

希望这会有所帮助。