反序列化空值以使用 Jackson 进行枚举

Kac*_*zar 5 java jackson deserialization spring-boot

我在 JSON 反序列化并将其映射到枚举时遇到问题。我从类似于这两个示例的外部 API 获取 JSON:

{
 "someValue": null
}
Run Code Online (Sandbox Code Playgroud)
{
 "someValue": "exists"
}
Run Code Online (Sandbox Code Playgroud)

我想将空值映射到某个默认枚举值。

模型对象

SomeEnum someValue;
Run Code Online (Sandbox Code Playgroud)

和枚举类

public enum SomeEnum {
    @JsonProperty("exists") EXISTS,
    NONE;
}
Run Code Online (Sandbox Code Playgroud)

对于存在,值模型类包含正确的枚举,但如果我null从 API获取,它仍然null在模型中。

我尝试创建一些由 注释的方法@JsonCreator,创建自己的枚举反序列化器,使用@JsonEnumDefaultValue但这些解决方案都不适合我。有谁知道,如何将空值反序列化为某个默认枚举?

小智 0

(老实说,我在这里写了这段代码,没有测试它,也许你需要稍微修改一下)

您可以尝试执行以下操作(Enum使用构造函数并使用@JsonCreator):

public enum SomeEnum {
    EXISTS("exists"),
    NONE(null);

    private String value;

    SomeEnum (String value) {
        this.value = value;
    }

    @JsonCreator
    public static SomeEnum fromValue(String value) {
        for (SomeEnum someEnum : SomeEnum.values()) {
            if (StringUtils.equalsIgnoreCase(someEnum.getValue(), value)) {
                return someEnum;
            }
        }
        throw new IllegalArgumentException("Unknown value " + value);
    }

    public String getValue () {
        return value;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果它不起作用,请保留上面的枚举并尝试制作一个自定义转换器(没有 Jackson),如下所示

如果使用 spring boot 你应该把这个活页夹放在你的控制器中

@InitBinder
public void initBinder(final WebDataBinder webdataBinder) {
    webdataBinder.registerCustomEditor(SomeEnum.class, new SomeEnumConverter());
}
Run Code Online (Sandbox Code Playgroud)

以下是自定义转换器,用于指定如何将输入值转换为枚举值。

public class SomeEnumConverter extends PropertyEditorSupport {
    @Override
    public void setAsText(final String text) {
        setValue(SomeEnum.fromValue(text));
    }
}
Run Code Online (Sandbox Code Playgroud)