我正在尝试使用Jackson将JSON反序列化为Java POJO。在不泄露机密信息的情况下,这是ObjectMapper反序列化失败时的示例堆栈跟踪:
org.codehaus.jackson.map.JsonMappingException: Can not construct Map key of type com.example.MyEnum from String "coins": not a valid representation: Can not construct Map key of type com.example.MyEnum from String "coins": not one of values for Enum class
我的JSON看起来像这样:
"foo": {
"coins": null,
...
}
我要反序列化的类有这个字段:
private Map<MyEnum, MyPojo> foo;
我的枚举类型如下:
public enum MyEnum {
COINS("coins"),
...
}
我确实意识到我正在尝试反序列化null值。但我相信这仍然有效:反序列化的结果应该等同于使用foo.put(MyEnum.COINS, null)
的Map,这确实是一个有效的Java指令。非常感谢帮助,提前谢谢。
答案 0 :(得分:8)
除了提出的一个好的解决方案(工厂方法)之外,还有另外两种方法:
ObjectMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING)
注释标记该方法(您实际上也可以在@JsonValue
上使用该方法,而不是启用上述功能) - 如果如果存在该注释,则该方法返回的值将用作id。答案 1 :(得分:7)
GRR!想出来了。
我的解决方案是在我的枚举中创建一个带有@JsonCreator
注释的静态方法,该方法基于String参数创建枚举实例。它看起来像这样:
@JsonCreator
public static MyEnum create(String str) {
// code to return an enum based on the String parameter
}
答案 2 :(得分:6)
在枚举类中提供一个静态工厂方法,用String构造枚举并用@JsonCreator注释它:
@JsonCreator
public static MyEnum fromValue(String v) {
for (MyEnum myEnum : values()) {
if (myEnum.text.equals(v)) {
return myEnum;
}
}
throw new IllegalArgumentException("invalid string value passed: " + v);
}