我试图在 POJO 中使用 Optional 来指示 json 字段何时可以为空、不存在或存在。我的问题是我无法弄清楚如何配置 jackson 以不处理Optional.empty()和null相同。对于empty(),我希望该字段被忽略。JsonInclude 值似乎都没有这样做。Jdk8Module#configureAbsentsAsNulls()看起来很有希望,但它不会改变我的测试结果。有没有办法做到这一点?
tl;dr
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 …Run Code Online (Sandbox Code Playgroud) 我有一个系统,其中显式null字段与 JSON 中不存在的字段不同。用 Java 表示 Jackson 序列化的最佳方式是什么?
例如,我有一个像
class Data {
public String string;
public String other;
}
Run Code Online (Sandbox Code Playgroud)
默认情况下,Jackson 序列化空字段,因此new ObjectMapper().writeValueAsString(new Data())结果为{"string":null,"other":null}. 但是,我希望这会导致{}字段“未设置”。显然,在 Java 中它们为空,但我正在寻找解决方法。
如果我这样做new ObjectMapper().wirteValueAsString(new Data(null, null)),我想这导致{"string":null,"other":null}。并且只有“字符串”字段导致{"string":"value"}.
我现在能想到的唯一方法是为每个字段设置布尔值并使用自定义序列化程序来检查布尔值,但这看起来很混乱。有没有更简单的方法来做到这一点?
编辑:这不是不序列化空值。如果字段显式设置为空,我希望空值被序列化。
我想也许我可以使用 Optionals 和 Include.NON_ABSENT,但不幸的是,这也不起作用,因为 Jackson 将 Optional 引用null视为与Optional.empty().