我有一個相當有趣的問題,試圖讓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
}