找不到类型 \[简单类型,类 ...\] 的(映射)键反序列化器

新手上路,请多包涵

我有一个具有地图的域对象:

 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]

如何纠正这个问题?我 无权 访问要修改的域对象。

原文由 Mick Knutson 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 652
2 个回答

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

解决这个问题的两个明显方法是:

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

在你的情况下,做前者可能更容易。您可能还想实现自定义密钥序列化程序,以确保密钥是正确格式的序列化程序。

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

原文由 StaxMan 发布,翻译遵循 CC BY-SA 3.0 许可协议

这是很久以前问过的,是查找错误时的第一个谷歌结果,但接受的答案没有代码,可能会让杰克逊初学者(我)感到困惑。我最终找到 了这个有用的答案

因此,正如接受的答案中所述,实施和注册“密钥反序列化器”是可行的方法。你可以这样做。

 SimpleModule simpleModule = new SimpleModule();
simpleModule.addKeyDeserializer(YourClass.class, new YourClassKeyDeserializer());
objectMapper.registerModule(simpleModule);

对于课堂,你所要做的就是:

 class YourClassKeyDeserializer extends KeyDeserializer
{
    @Override
    public Object deserializeKey(final String key, final DeserializationContext ctxt ) throws IOException, JsonProcessingException
    {
        return null; // replace null with your logic
    }
}

而已!类上没有注释,地图没有自定义反序列化器等。

原文由 estebanrv 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题