如何使用Jackson反序列化空字符串?

10

我希望使用Jackson反序列化JSON,将空字符串映射为标准枚举类型。

当我尝试在JsonProperty中使用空字符串时,它会忽略空值并抛出异常;

value not one of declared Enum instance names:......,STANDARD,...

有什么方法可以处理这个问题吗?

public enum Type{

    @JsonProperty("")
    STANDARD,

    @JsonProperty("complex")
    COMPLEX,

    ....

}
我的json;
....
"type": "",
....

1
可能这个可以帮到你:https://dev59.com/l2cs5IYBdhLWcg3w8oTK - awesoon
1
编写枚举工厂并将其注释为 @JsonCreator - Pratapi Hemant Patel
2个回答

9

@JsonValue 可以完成此技巧:

public enum Type {

    STANDARD(""),
    COMPLEX("complex");

    private String value;

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

    @JsonValue
    public String getValue() {
        return value;
    }
}

@JsonValue文档中摘取相关部分:
这是一个标记注解,用于指示被注释的访问器(可以是字段或“getter”方法[具有非void返回类型和无参数的方法])的值应该作为实例的单个值用于序列化,而不是收集值的属性的通常方法。如果一个类的多个访问器被注释了,最多只能有一个访问器被注释;如果发现多个,则可能会抛出异常。
注意:当用于Java枚举时,另外一个特性是被注释方法返回的值也被认为是要反序列化的值,而不仅仅是要序列化为JSON字符串的值。这是因为枚举值集合是常量,并且可以定义映射,但对于POJO类型通常无法做到这一点;因此,这不用于POJO反序列化。

你能解释一下这是如何工作的吗?我在反序列化/序列化中使用了它。我将空字符串传递给序列化 "",然后得到了 EMPTY,在反序列化 EMPTY 时,我得到了 ""。这类似于在此之下进行 valueOf 检查吗? - Piotr Żak

1
你可以尝试使用@JsonInclude注解来忽略空值,并根据需要使用JsonInclude.Include.NON_NULLJsonInclude.Include.NON_EMPTY
例如:

@JsonInclude(JsonInclude.Include.NON_NULL) STANDARD


3
我认为这样做行不通。@JsonInclude 只在序列化时有效,而在反序列化时无效。 - Pratapi Hemant Patel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接