Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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将空值反序列化为枚举_Java_Spring Boot_Jackson_Deserialization - Fatal编程技术网

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

Java 使用Jackson将空值反序列化为枚举,java,spring-boot,jackson,deserialization,Java,Spring Boot,Jackson,Deserialization,我对JSON反序列化和将其映射到枚举有问题。我将从外部API获取JSON,这两个示例类似: { "someValue": null } 我想将空值映射到一些默认枚举值 模型对象 SomeEnum someValue; 和枚举类 public enum SomeEnum { @JsonProperty("exists") EXISTS, NONE; } 对于exists,值模型类包含正确的枚举,但如果我从API中获取null,它在模型中仍然是null 我试图创建一些由@Js

我对JSON反序列化和将其映射到枚举有问题。我将从外部API获取JSON,这两个示例类似:

{
 "someValue": null
}
我想将空值映射到一些默认枚举值

模型对象

SomeEnum someValue;
和枚举类

public enum SomeEnum {
    @JsonProperty("exists") EXISTS,
    NONE;
}
对于exists,值模型类包含正确的枚举,但如果我从API中获取
null
,它在模型中仍然是
null

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

(老实说,我在这里编写了这段代码,但没有对其进行测试,也许您需要对其进行一些修改)

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

如果不起作用,请保留上面的枚举,并尝试制作一个自定义转换器(不带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));
    }
}

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

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
    }

但是我还是更喜欢使用@JsonProperty之类的东西,但是对于null,比如@JsonNullProperty或者类似的东西?这不起作用,默认值被null覆盖。您可以只使用
@JsonValue public String getValue()
@JsonValue进行返回,但问题是关于输入检查文档。对于enum,它是双向的。据我所知,@JsonCreator仅用于现有值,而对于null则被忽略。我把我的答案贴了出来。谢谢你回答我的问题。顺便说一句,我没有尝试那个绑定器解决方案,但我尝试使用org.springframework.core.convert.convert.converter.converter实现自定义转换器,但效果不太好
public class SomeEnumConverter extends PropertyEditorSupport {
    @Override
    public void setAsText(final String text) {
        setValue(SomeEnum.fromValue(text));
    }
}
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(using = SomeEnumDeserializer.class)
public enum SomeEnum {
// code
}