![](/img/trans.png)
[英]Jackson ObjectMapper: How to omit (ignore) fields of certain type from serialization?
[英]How can I configure a Jackson ObjectMapper to serialize certain fields of certain beans with a custom value if they are null?
我有一個屬於我無法訪問的第三方庫的類。 看起來像:
public class Product {
private String thumbnailUrl;
// many other properties, some of which are POJOs or collections
public String getThumbnailUrl() {
return thumbnailUrl;
}
public void setThumbnailUrl(String thumbnailUrl) {
this.thumbnailUrl = thumbnailUrl;
}
}
這只是我要使用Jackson序列化為字符串的類之一。 還有很多其他人。
thumbnailUrl
屬性有時可以為null
。 如何將此字段序列化為http://www.example.com/unknown.png
(如果為null
,如何配置ObjectMapper
?
我想我不能使用mixins,因為mixins將無法訪問原始對象,因此無法檢查屬性的值是否為null
。
這應該做的伎倆:
private String thumbnailUrl = "http://my.default.url";
正如評論中提到的OP,該類來自第三方庫,因此修改它(a'la this SO )或注釋(a'la this SO )不是一種選擇。 在這種情況下,您還有兩個選項:
修補第三方庫(顯然你有權訪問源;))
在自定義序列化程序中解決它的問題(需要進行適當的測試,這種快速入侵在多線程環境中不起作用)
如:
@Override
public void serialize(Product value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonProcessingException {
boolean revert = false;
if (value.thumbnailUrl == null) {
value.thumbnailUrl = "http://my.default.url";
revert = true;
}
jgen.writeObject(value);
if (revert) {
value.thumbnailUrl = null;
}
}
我最終得到了這個解決方案,但它並不像我期望的那樣簡單:
@Test
public void shouldSerializeDefaultThumbnailUrlIfThumbnailUrlIsNull() throws Exception {
// Given
Product p = new Product();
p.setPrimaryKey("123");
PropertyFilter filter = new SimpleBeanPropertyFilter() {
@Override
public void serializeAsField(Object pojo, JsonGenerator jgen, SerializerProvider prov, PropertyWriter writer) throws Exception {
if (pojo.getClass().equals(Product.class)
&& ((Product) pojo).getThumbnailUrl() == null
&& writer.getName().equals("thumbnailUrl")) {
jgen.writeStringField(writer.getName(), "http://www.example.com/default.png");
} else {
writer.serializeAsField(pojo, jgen, prov);
}
}
};
FilterProvider filters = new SimpleFilterProvider().addFilter("thumbnailFilter", filter);
this.mapper.setFilterProvider(filters);
String json = this.mapper.writeValueAsString(p);
assertThat(json, equalTo("{\"thumbnailUrl\":\"http://www.example.com/default.png\",\"id\":\"123\"}"));
}
忽略這個。 它在我的情況下不起作用,因為我的課程需要注釋,我不能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.