杰克逊无法将空字符串值转换为枚举
Jackson cannot convert empty string value to enum
我正在寻找 Jackson (2.8) 的便捷解决方案来过滤掉指向空字符串值的字段 before/during 反序列化:
@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);
错误
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"])
我还尝试了什么...
啊这个
mapper.getDeserializationConfig().with(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
错误仍然存在,显然甚至谷歌搜索也无济于事...
编辑
set DeserializationFeature 不能像上面举例说明的那样工作。对我来说,解决方案最终是添加这个片段:
mapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true)
如果字符串与枚举文字不匹配,您可以使用 returns 空值的工厂:
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;
}
}
当然,实现可以根据您的逻辑进行更改,但这允许使用枚举的 null
值。
JsonCreator
注释告诉 Jackson 调用该方法来获取字符串的实例。
您可以为您的映射器启用 DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL
,默认情况下它是禁用的。唯一需要注意的是使用它,它将把所有未知的包括空字符串都视为枚举的 null。
我正在寻找 Jackson (2.8) 的便捷解决方案来过滤掉指向空字符串值的字段 before/during 反序列化:
@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);
错误
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"])
我还尝试了什么... 啊这个
mapper.getDeserializationConfig().with(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
错误仍然存在,显然甚至谷歌搜索也无济于事...
编辑
set DeserializationFeature 不能像上面举例说明的那样工作。对我来说,解决方案最终是添加这个片段:
mapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true)
如果字符串与枚举文字不匹配,您可以使用 returns 空值的工厂:
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;
}
}
当然,实现可以根据您的逻辑进行更改,但这允许使用枚举的 null
值。
JsonCreator
注释告诉 Jackson 调用该方法来获取字符串的实例。
您可以为您的映射器启用 DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL
,默认情况下它是禁用的。唯一需要注意的是使用它,它将把所有未知的包括空字符串都视为枚举的 null。