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

标签 java spring-boot jackson deserialization

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

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

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

模型对象
SomeEnum someValue;

和枚举类
public enum SomeEnum {
    @JsonProperty("exists") EXISTS,
    NONE;
}

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

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

最佳答案

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

您可以尝试执行以下操作( 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 你应该把这个活页夹放在你的 Controller 中
@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));
    }
}

关于java - 反序列化空值以使用 Jackson 进行枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61051783/

相关文章:

java - 转换为父类(super class)后从子类获取数据

java - 获取http响应代码和所有可用的正文

mysql - 无法将 mysql docker 容器与 spring boot 应用程序链接 - 通信链接失败

java - JSON : Unrecognized field "value" (<objectClass>), 未标记为可忽略

java - 多态数组失败的序列化

java - Jackson:JsonIninclude 如何添加多个 JsonIninclude 注释

java - jax ws 获取客户端ip

java - 无法在 JBoss 6.1.0 中使用资源注释注入(inject) JMS QueueConnectionFactory

java - 如何在 GAE j2ee 中更改 index.html (AngularJS) 的路径

java - Spring Boot 2.1 中热重载 Thymeleaf 模板和资源包