如何用杰克逊反序列化空字符串?
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_NULL
或JsonInclude.Include.NON_EMPTY
例如:-
@JsonInclude(JsonInclude.Include.NON_NULL)
STANDARD
【讨论】:
我认为这行不通。 @JsonInclude 仅适用于序列化,不适用于反序列化。以上是关于如何用杰克逊反序列化空字符串?的主要内容,如果未能解决你的问题,请参考以下文章