使用Jackson将空值反序列化为枚举

frebpwbc  于 2022-11-08  发布在  其他
关注(0)|答案(3)|浏览(174)

我在JSON反序列化和将其Map到枚举时遇到了问题。我从外部API获取JSON,类似于下面两个示例:
第一个
我想将空值Map到某个默认枚举值。
模型对象

SomeEnum someValue;

和枚举类

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

对于exists,价值模型类包含正确的枚举,但是如果我从API得到null,它在模型中仍然是null
我试着用@JsonEnumDefaultValue创建一些用@JsonCreator注解的方法,创建自己的枚举反序列化器,但是这些解决方案都不适合我。有人知道吗,我怎么才能把空值反序列化为一些默认的枚举?

edqdpe6u

edqdpe6u1#

(老实说,我在这里写了这个代码没有测试它,也许你需要修改它一点)
您可以尝试执行如下操作(带构造函数的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;
    }
}

如果不起作用,请保留上面的枚举,并尝试创建一个自定义转换器(没有Jackson),如下所示
如果使用 Spring Boot 您应该将此活页夹放入控制器中

@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));
    }
}
ncecgwcz

ncecgwcz2#

好了,现在我通过创建自定义枚举反序列化器解决了这个问题。

class SomeEnumDeserializer extends StdDeserializer<SomeEnum> {
    SomeEnumDeserializer() {
        super(SomeEnum.class);
    }

    @Override
    public SomeEnum getNullValue(DeserializationContext ctxt) {
        return SomeEnum.NONE;
    }

    @Override
    public SomeEnum deserialize(JsonParser p, DeserializationContext ctxt) {
        // implementation here
    }

并使用@JsonDeserialize注册它:

@JsonDeserialize(using = SomeEnumDeserializer.class)
public enum SomeEnum {
// code
}

但我还是更喜欢使用@JsonProperty之类的东西,但要为null,比如@JsonNullProperty或类似的东西。

ilmyapht

ilmyapht3#

将字段的起始值设置为枚举的值。

public class ExampleClass {
    @JsonProperty("someValue") public SomeEnum someValue = SomeEnum.NONE;

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

但是,这意味着如果该值不存在,它也将与指定了null时的值相同。
第一个
不确定这种行为是否是你想要的。

相关问题