【问题标题】: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": "",
....

【问题讨论】:

标签: java jackson


【解决方案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 仅适用于序列化,不适用于反序列化。
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 2015-04-07
相关资源
最近更新 更多