如何用杰克逊反序列化空字符串?

Posted

技术标签:

【中文标题】如何用杰克逊反序列化空字符串?【英文标题】:How to deserialize empty strings with jackson? 【发布时间】:2018-10-19 11:32:11 【问题描述】:

我想用 Jackson 反序列化一个 json,并且我想将空字符串映射到 STANDARD 枚举类型。

当我尝试将 JsonProperty 与空字符串一起使用时,它会忽略空值并引发异常;

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

有什么办法可以解决吗?

public enum Type

    @JsonProperty("")
    STANDARD,

    @JsonProperty("complex")
    COMPLEX,

    ....


我的 json;

....
"type": "",
....

【问题讨论】:

这可能会有所帮助:***.com/questions/12468764/… 为枚举写一个工厂并注解到@JsonCreator 【参考方案1】:

@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 返回类型的方法,无参数])将用作实例序列化的单个值,而不是收集价值属性的常用方法。 [...]

Class 的访问者最多可以使用此注解进行注解;如果找到多个,则可能会引发异常。 [...]

注意:当用于 Java 枚举时,一个附加功能是注释方法返回的值也被认为是要反序列化的值,而不仅仅是要序列化的 JSON 字符串。这是可能的,因为 Enum 值的集合是恒定的,并且可以定义映射,但对于 POJO 类型通常不能这样做;因此,这不用于 POJO 反序列化。

【讨论】:

您能解释一下这是如何工作的吗?我在反序列化/序列化中使用了它。我将空字符串传递给序列化“”并且我有 EMPTY 并且在 EMPTY 的反序列化中我有“”。类似于 valueOf 的检查?【参考方案2】:

您可以尝试使用@JsonInclude 注释来忽略空值并根据需要使用JsonInclude.Include.NON_NULLJsonInclude.Include.NON_EMPTY

例如:-

@JsonInclude(JsonInclude.Include.NON_NULL) STANDARD

【讨论】:

我认为这行不通。 @JsonInclude 仅适用于序列化,不适用于反序列化。

以上是关于如何用杰克逊反序列化空字符串?的主要内容,如果未能解决你的问题,请参考以下文章

反序列化的改造/杰克逊错误

杰克逊从JSON中的变量类型反序列化

杰克逊:地图的反序列化

有啥方法可以防止杰克逊中的字段反序列化?

JSON杰克逊序列化反序列化列表列表

杰克逊:反序列化(解析)空Unicode