杰克逊反序列化为具有枚举键的 Map,POJO 值

我正在尝试使用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"),
    ...
}

我确实意识到我正在尝试反序列化空值。但我相信这应该仍然有效:反序列化的结果应该等同于有一个Map with ,这确实是一个有效的Java指令。非常感谢您的帮助,提前致谢。foo.put(MyEnum.COINS, null)


答案 1

除了提出一个好的解决方案(工厂方法)之外,还有其他两种方法:

  • 如果'MyEnum.toString()'将返回“coins”,你可以让Jackson使用“toString()”而不是“name()”ObjectMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING)
  • 您可以添加一些其他方法来返回要使用的id,并用注释标记该方法(您实际上也可以使用该方法,而不是启用上面的功能) - 如果该注释存在,则该方法返回的值将用作id。@JsonValuetoString()

答案 2

咕噜咕噜!想通了。

对我来说,解决方案是创建一个静态方法,在我的枚举中用 注释,该方法基于 String 参数创建枚举的实例。它看起来像这样:@JsonCreator

@JsonCreator
public static MyEnum create(String str) {
    // code to return an enum based on the String parameter
}