Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson可选字段为空()vs null_Java_Json_Jackson - Fatal编程技术网

Java Jackson可选字段为空()vs null

Java Jackson可选字段为空()vs null,java,json,jackson,Java,Json,Jackson,我试图在POJO中使用Optional来指示json字段何时可以为null、不存在或存在。我的问题是,我无法理解如何配置jackson,使其不将Optional.empty()和null视为相同。对于empty(),我希望忽略该字段。JsonInclude的值似乎都没有做到这一点Jdk8Module#configureAbsentsAsNulls()看起来很有希望,但它不会改变我的测试结果。有办法做到这一点吗 tl;dr null值应序列化,可选。empty()不应序列化 下面是一些测试,展示了

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

tl;dr
null
值应序列化,
可选。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);
}
类POJO{
公共可选内容;
}
私有对象映射器getMapper(){
返回新的ObjectMapper().registerModule(新的Jdk8Module());
}
@org.junit.Test
public void testAbsent()引发JsonProcessingException{
ObjectMapper映射器=getMapper();
POJO POJO=新POJO();
pojo.content=Optional.empty();
字符串结果=mapper.writeValueAsString(pojo);
assertEquals(“{}”,结果);
}
@org.junit.Test
public void testNull()引发JsonProcessingException{
ObjectMapper映射器=getMapper();
POJO POJO=新POJO();
pojo.content=null;
字符串结果=mapper.writeValueAsString(pojo);
assertEquals(“{\'content\':null}”,结果);
}
@org.junit.Test
public void testPresent()引发JsonProcessingException{
ObjectMapper映射器=getMapper();
POJO POJO=新POJO();
pojo.content=Optional.of(“Hello”);
字符串结果=mapper.writeValueAsString(pojo);
assertEquals(“{\'content\':\'Hello\'”),结果);
}

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