【发布时间】: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 你能解决这个问题吗?