如何使用Jackson反序列化空字符串并映射至指定枚举类型?
解决Jackson反序列化空字符串到枚举的问题
我明白你遇到的困扰了——给枚举值加上@JsonProperty("")注解后,Jackson还是没法把空字符串映射到STANDARD,反而抛出枚举值不匹配的异常。这是因为Jackson默认的枚举反序列化逻辑对空字符串的处理比较特殊,不会自动匹配@JsonProperty("")的标注值。下面给你几个可行的解决方案:
方案一:自定义枚举反序列化器
写一个自定义的JsonDeserializer,显式处理空字符串的映射逻辑:
首先创建反序列化器类:
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.annotation.JsonProperty; import java.io.IOException; public class TypeDeserializer extends JsonDeserializer<Type> { @Override public Type deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { String inputValue = p.getText(); // 处理空字符串或null的情况 if (inputValue == null || inputValue.trim().isEmpty()) { return Type.STANDARD; } // 匹配其他带@JsonProperty的枚举值 for (Type type : Type.values()) { JsonProperty prop = type.getAnnotation(JsonProperty.class); if (prop != null && prop.value().equals(inputValue)) { return type; } } // 没有匹配到的情况,抛出异常(或者你可以返回默认值) throw new IllegalArgumentException("Unknown Type value: " + inputValue); } }
然后在枚举类上添加@JsonDeserialize注解指定这个反序列化器:
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.annotation.JsonProperty; @JsonDeserialize(using = TypeDeserializer.class) public enum Type { @JsonProperty("") STANDARD, @JsonProperty("complex") COMPLEX // 其他枚举值 }
方案二:使用@JsonCreator静态方法
这个方案更简洁,不需要额外的类,直接在枚举内部添加一个静态处理方法:
import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; public enum Type { @JsonProperty("") STANDARD, @JsonProperty("complex") COMPLEX; @JsonCreator public static Type fromInputValue(String value) { // 优先处理空字符串或null if (value == null || value.trim().isEmpty()) { return STANDARD; } // 遍历枚举匹配@JsonProperty的值 for (Type type : Type.values()) { JsonProperty prop = type.getAnnotation(JsonProperty.class); if (prop != null && prop.value().equals(value)) { return type; } } // 未匹配时抛出异常 throw new IllegalArgumentException("Invalid Type: " + value); } }
这个方法会被Jackson自动调用,用来解析输入的字符串值,我们可以在里面完全控制空字符串的映射逻辑。
为什么原来的@JsonProperty("")不生效?
Jackson默认的枚举反序列化器在处理空字符串时,不会主动匹配@JsonProperty("")的标注。它通常只会匹配枚举的name()或者非空的@JsonProperty值,空字符串被视为特殊值,跳过了常规的匹配流程。通过上面两种自定义处理方式,我们就能显式覆盖这个逻辑,让空字符串正确映射到STANDARD。
内容的提问来源于stack exchange,提问作者hellzone
相关产品推荐
相关产品推荐

