【问题标题】:Jackson optional field empty() vs nullJackson 可选字段 empty() vs null
【发布时间】:2018-02-22 19:25:54
【问题描述】:

我正在尝试在 POJO 中使用 Optional 来指示 json 字段何时可以为空、不存在或存在。我的问题是我无法弄清楚如何配置杰克逊不将Optional.empty()null 视为相同。对于empty(),我希望忽略该字段。 JsonInclude 值似乎都没有这样做。 Jdk8Module#configureAbsentsAsNulls() 看起来很有希望,但它不会改变我的测试结果。有没有办法做到这一点?

tl;博士 null应该被序列化,Optional.empty() 不应该被序列化。

这里有一些测试展示了我想要实现的行为。

class POJO {
    public Optional<String> content;
}

private ObjectMapper getMapper() {
    return new ObjectMapper().registerModule(new Jdk8Module());
}

@org.junit.Test
public void testAbsent() throws JsonProcessingException {
    ObjectMapper mapper = getMapper();

    POJO pojo = new POJO();
    pojo.content = Optional.empty();

    String result = mapper.writeValueAsString(pojo);

    assertEquals("{}", result);
}

@org.junit.Test
public void testNull() throws JsonProcessingException {
    ObjectMapper mapper = getMapper();

    POJO pojo = new POJO();
    pojo.content = null;

    String result = mapper.writeValueAsString(pojo);

    assertEquals("{\"content\":null}", result);
}

@org.junit.Test
public void testPresent() throws JsonProcessingException {
    ObjectMapper mapper = getMapper();

    POJO pojo = new POJO();
    pojo.content = Optional.of("Hello");

    String result = mapper.writeValueAsString(pojo);

    assertEquals("{\"content\":\"Hello\"}", result);
}

【问题讨论】:

  • 能否请您发布一个您希望通过但失败的最小示例测试用例(例如,配置映射器、将字段设置为空、序列化、显示输出)?
  • 刚刚添加了一些测试。很抱歉他们一开始就不在那里。
  • 正如我在原始问题中所说(以及测试中指出的), null 应该被序列化,而 empty() 不应该。这不是模块的默认行为。该问题没有回答如何实现这种行为。
  • @Panda 你能解决这个问题吗?

标签: java json jackson


【解决方案1】:

可以使用JsonInclude.Include.CUSTOM规则和自定义value过滤器来实现:

class OptionalFilter {

    @Override
    public boolean equals(Object obj) {
        return obj instanceof Optional && ((Optional<?>) obj).isEmpty();
    }
}

class POJO {
    @JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = OptionalFilter.class)
    public Optional<String> content;
}

configureAbsentsAsNulls 设置为true

new Jdk8Module().configureAbsentsAsNulls(true)

【讨论】:

    猜你喜欢
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    相关资源
    最近更新 更多