要用Jackson枚举的反序列化null值

问题描述 投票:0回答:1

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

{
 "someValue": null
}
{
 "someValue": "exists"
}

我想将空值映射到一些默认的枚举值。

模型对象

SomeEnum someValue;

和枚举类

public enum SomeEnum {
    @JsonProperty("exists") EXISTS,
    NONE;
}

对于存在值模型类包含正确的枚举,但是如果我从API获得空值,则它在模型中仍为空值。

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

java spring-boot jackson deserialization
1个回答
0
投票

(老实说,我在这里编写此代码而不进行测试,也许您需要对其进行一些修改)

您可以尝试执行以下操作(使用构造函数进行枚举并使用@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;
    }
}

如果不起作用,请保留上面的枚举,并尝试按以下方法制作自定义转换器(不带杰克逊)

如果使用弹簧靴,则应将此装订器放入控制器中

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

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

public class SomeEnumConverter extends PropertyEditorSupport {
    @Override
    public void setAsText(final String text) {
        setValue(SomeEnum.fromValue(text));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.