我正在尝试使用 Jackson 将 JSON 反序列化为 Java POJO。在不泄露 secret 信息的情况下,以下是 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"),
...
}
我意识到我正在尝试反序列化一个空值。但我相信这应该仍然有效:反序列化的结果应该等同于具有 foo.put(MyEnum.COINS, null)
的 Map,这确实是一个有效的 Java 指令。非常感谢您的帮助,提前致谢。
最佳答案
除了提出的一种很好的解决方案(工厂方法)外,还有另外两种方式:
- 如果“MyEnum.toString()”会返回“硬币”,您可以使用
ObjectMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING)
- 您可以添加一些其他方法来返回要使用的 id,并使用
@JsonValue
注释标记该方法(您实际上也可以在toString()
上使用它,而不是启用上述功能)——如果该注释存在,则该方法返回的值将用作 ID。
关于java - Jackson 使用 Enum Key 和 POJO Value 反序列化为 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13406568/