一尘不染

找不到类型[简单类型,类com.comcast.ivr.core.domain.AutoHandlingSlotKey]的(地图)密钥反序列化器

json

我有一个具有Map的域对象:

private Map<AutoHandlingSlotKey, LinkedHashSet<AutoFunction>> autoHandling;

当我序列化对象时,得到以下信息:

"autoHandling" : [ "java.util.HashMap", {
} ],

该地图的键是一个自定义对象:

public class AutoHandlingSlotKey implements Serializable {
    private FunctionalArea slot; // ENUM
    private String returnView;   // ENUM

因此,我不确定在反序列化对象时如何解决这个问题,我将不断纠正:

org.codehaus.jackson.map.JsonMappingException: Can not find a (Map) Key deserializer for type [simple type, class com.comcast.ivr.core.domain.AutoHandlingSlotKey]

有人能帮我可以了解如何解决此问题,如果我 能够访问域对象要修改?


阅读 184

收藏
2020-07-27

共1个答案

一尘不染

默认情况下,Jackson尝试将Java Maps序列化为JSON对象(键/值对),因此Map
key对象必须以某种方式序列化为String;并且必须有匹配的(和注册的)密钥解串器。默认配置仅支持一小部分JDK类型(字符串,数字,枚举)。因此,映射器不知道如何获取String并从中创建AutoHandlingSlotKey。(实际上,令我惊讶的是序列化程序没有因相同的原因而失败)

解决此问题的两种明显方法是:

  • 实施并注册“密钥反序列化器”
  • 为地图实现并注册自定义反序列化器。

就您而言,做前者可能更容易。您可能还需要实现自定义密钥序列化程序,以确保密钥是正确格式的序列化程序。

注册序列化器和解串器的最简单方法是在Jackson
1.7中添加的模块接口(并在1.8中扩展以支持关键序列化器/解串器)。

2020-07-27