java - Jackson 使用 Enum Key 和 POJO Value 反序列化为 Map

标签 java json serialization jackson jsonserializer

我正在尝试使用 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/

相关文章:

python - 如何在 python 中读取/理解 PHP 序列化数据字符串

java - 高性能流数据处理问题

java - Jetty服务器无法返回json

java - Parse.com - Android - 在大对象列表中搜索 3 个对象

json - 服务器端排序的数据在数据表中未按相同顺序显示

c - 带有 json-c 库的 C 语言 JsonParser | json_object_object_get(...) 未声明

c# - 如何序列化一个对象,其中该对象具有从操作创建的委托(delegate)?

java - 跨不同 Android 版本保存/加载 ArrayList

java - junit测试用spring删除方法

java - FileOutputStream try-with-resources 不关闭文件描述符