2017-01-26 21 views
1

我有一個相當有趣的問題,試圖讓Jackson從自定義序列化器類創建的JSON結果中正確刪除空字段。我已經徹底搜索了關於Serializer和SerializationInclusion配置的信息,但是我還沒有找到任何似乎解釋我所看到的內容。配置傑克遜兌現自定義串行器類的SerializationInclusion配置

我有一個Jackson對象映射器,通過Spring進行配置和自動裝配。對象映射器配置和POJO(爲了簡潔而編輯)看起來或多或少像下面的代碼。

出於某種原因,當我撥打我們的REST端點,以獲取包含上面的例子中值我看到下面的行爲一個酒吧對象返回:

  • 的SerializationInclusion設置被應用到那些空的所有屬性或者自己爲null(name,aList,objId)。
  • SerializationInclusion設置不會應用於任何由自定義Serializer類設置爲null的屬性,並且我們會返回具有null值的JSON。

在這裏,我想到的是串行器邏輯被調用後,傑克遜已經從JSON刪除了所有空和空值,因此「foo」的屬性已正確設置爲空,但不因爲包含邏輯已經執行而被刪除。

有沒有人對這裏可能會發生什麼有什麼想法?這是在2.2.2版本中如何實現Jackson-databind庫的一個怪癖嗎?


傑克遜配置 -

@Bean 
public JacksonObjectMapper jacksonMapper() { 
    final JacksonObjectMapper mapper = new JacksonObjectMapper(); 

    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
    mapper.enable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY); 
    mapper.enable(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS); 
    mapper.registerModule(agJacksonModule()); 

    return mapper; 
} 

@Bean 
public SimpleModule agJacksonModule() { 
    final SimpleModule module = new SimpleModule(); 

    module.addSerializer(Foo.class, new FooSerializer()); 

    return module; 
} 

自定義序列 -

public class FooSerializer extends JsonSerializer<Foo> { 

@Override 
public void serialize(Sponsor sponsor, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) 
     throws IOException { 

    // write null value for sponsor json property, if sponsor object has all empty or null fields 
    if(sponsor == null || isObjectEmpty(sponsor)) { 
     jsonGenerator.writeNull(); 
     return; 
    } 

    // write out object 
    jsonGenerator.writeStartObject(); 
    jsonGenerator.writeStringField("imgUrl", sponsor.getImgUrl()); 
    jsonGenerator.writeStringField("clickUrl", sponsor.getClickUrl()); 
    jsonGenerator.writeStringField("sponsorName", sponsor.getSponsorName()); 
    jsonGenerator.writeStringField("sponsorText", sponsor.getSponsorText()); 
    jsonGenerator.writeEndObject(); 

} 

private boolean isObjectEmpty(Sponsor sponsor) { 
    return Strings.isNullOrEmpty(sponsor.getClickUrl()) 
      && Strings.isNullOrEmpty(sponsor.getImgUrl()) 
      && Strings.isNullOrEmpty(sponsor.getSponsorName()) 
      && Strings.isNullOrEmpty(sponsor.getSponsorText()); 
} 

}

對象模型看起來是這樣的(再次編輯爲簡潔起見,樣本值設置以班級成員爲例):

酒吧POJO -

public abstract class Bar { 

    protected Foo foo = aFoo; 
    protected String name = ""; 
    protected ArrayList aList = Lists.newArrayList(); 
    protected String objId = null; 

    // some getters and setters for the above properties 
} 

美孚POJO -

public abstract class Foo { 

    protected String aString = ""; 
    protected String bString = ""; 
    protected String cString = ""; 
    protected String dString = ""; 

    // some getters and setters for the above properties 
} 

回答

0

重寫和實現JsonSerializer的isEmpty方法來實現你想要的。

爲了什麼emptymeans自定義,你JsonSerializer實現需要重寫此方法:

public boolean isEmpty(SerializerProvider provider, T value); 

注意,它是具有處理過濾,因爲它寫字段名來電者;只有在需要實際序列化時纔會調用序列化程序。