杰克逊无法将空字符串值转换为枚举值

cri*_*shu 6 java json jackson2

我正在寻找一个方便的解决方案与Jackson(2.8)在反序列化之前/期间筛选出指向空字符串值的字段:

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class Guis {

public enum Context {
    SDS,
    NAVIGATION
}

public enum Layer {
    Library,
    Status,
    Drivingdata
}

// client code

 String s = "{\"context\":\"\",\"layer\":\"Drivingdata\"}";
 ObjectMapper mapper = new ObjectMapper();
 Guis o = mapper.readValue(s, Guis.class);
Run Code Online (Sandbox Code Playgroud)

错误

 Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not deserialize value of type cq.speech.rsi.api.Guis$Context from String "": value not one of declared Enum instance names: [SDS NAVIGATION] at [Source: {"context":"","layer":"Drivingdata"}; line: 1, column: 12] (through reference chain: cq.speech.rsi.api.Guis["context"])
Run Code Online (Sandbox Code Playgroud)

还有什么我试过的......啊这一个

mapper.getDeserializationConfig().with(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
Run Code Online (Sandbox Code Playgroud)

错误仍然存​​在,显然甚至谷歌搜索都没有多大帮助......

编辑

set DeserializationFeature不能像上面举例说明的那样工作.对我来说,解决方案最终是添加这个片段:

 mapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true)
Run Code Online (Sandbox Code Playgroud)

Ami*_*mar 13

您可以DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL为映射器启用,默认情况下禁用它.只是告诫使用它,它会将所有未知的包括空字符串视为null为枚举.

  • 要添加 debiasej 注释:您需要使用 @JsonEnumDefaultValue 标记枚举值之一 https://fasterxml.github.io/jackson-databind/javadoc/2.8/com/fasterxml/jackson/databind/DeserializationFeature.html#READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE (2认同)

ern*_*t_k 8

如果字符串与枚举文字不匹配,则可以使用工厂返回空值:

public enum Context {
    SDS,
    NAVIGATION;

    @JsonCreator
    public static Context forName(String name) {
        for(Context c: values()) {
            if(c.name().equals(name)) { //change accordingly
                return c;
            }
        }

        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,实现可以根据您的逻辑进行更改,但这允许null为枚举使用值。

JsonCreator注解告诉杰克逊调用方法来获取一个实例的字符串。