如何在Jackson序列化期间跳过Optional.empty字段?

And*_*nes 5 java serialization json jackson spring-boot

我有一个带有Optional字段的Java类.我使用Jackson 2.8.3(从Spring web 4.3.3调用)将类序列化为JSON.

如果Optional为空,我希望让序列化程序跳过该字段,并序列化包含的字符串(如果存在).我正在寻找两个对象列表的结果示例:

[
    {
        "id": 1,
        "foo": "bar"
    },
    {
        "id": 2,
    }
]
Run Code Online (Sandbox Code Playgroud)

对于id为2的对象,foo Optional为空.

相反,我得到的是:

[
    {
        "id": 1,
        "foo": {
            "present": true
        }
    },
    {
        "id": 2,
        "foo": {
            "present": false
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

即使我在类中注释"bar"字段,这也是结果

@JsonInclude(JsonInclude.Include.NON_ABSENT)
public Optional<String> getFoo() { ...
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以使用Jackson注释或自定义序列化器来获得第一个列表的结果?

Bar*_*cki 12

无需编写自定义序列化程序.用你的课程注释@JsonInclude(JsonInclude.Include.NON_ABSENT).com.fasterxml.jackson.datatype:jackson-datatype-jdk8并且objectMapper.registerModule(new Jdk8Module());也会正常工作.

您还需要包含 @JsonInclude(JsonInclude.Include.NON_ABSENT)作为您的依赖项.

  • 要排除Optional.empty()字段,正如OP最初要求的那样,必须添加依赖项并且必须设置NON_ABSENT。NON_NULL 还不够。 (2认同)