如何将Jackson ObjectMapper配置为使用自定义值序列化某些bean的某些字段(如果它们为null)?

时间:2017-01-11 13:31:52

标签: java json jackson

我有一个属于我无法访问的第三方库的课程。它看起来像:

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。如何ObjectMapper配置http://www.example.com/unknown.png以将此字段序列化为null,如果它是null

我认为我无法使用mixins因为mixins无法访问原始对象,因此他们无法检查属性的值是否为enum。< / p>

2 个答案:

答案 0 :(得分:0)

这应该可以解决问题:

private String thumbnailUrl = "http://my.default.url";

正如评论中提到的OP,该课程来自第三方库,因此修改它(a&#39; la this SO)或注释(a&#39; 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;
    }
}

答案 1 :(得分:0)

我最终得到了这个解决方案,但并不像我期望的那样简单:

@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\"}"));
}

忽略这一点。它在我的情况下不起作用,因为我的课程需要注释,我不能。