簡體   English   中英

如何將Jackson ObjectMapper配置為使用自定義值序列化某些bean的某些字段(如果它們為null)?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM