2013-12-16 75 views
0

我想排除值小於零的所有屬性。傑克遜有一些準備好使用解決方案,或者我應該創建CustomSerializerFactory和BeanPropertyWriter?傑克遜,如何忽略一些值

回答

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

希望這有助於。