我有一个具有地图的域对象:
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 许可协议
默认情况下,Jackson 尝试将 Java 映射序列化为 JSON 对象(键/值对),因此必须以某种方式将映射键对象序列化为字符串;并且必须有匹配(和注册)的密钥反序列化器。默认配置仅支持一小组 JDK 类型(字符串、数字、枚举)。所以 mapper 不知道如何获取 String 并从中创建 AutoHandlingSlotKey。 (事实上我很惊讶序列化器没有因为同样的原因而失败)
解决这个问题的两个明显方法是:
在你的情况下,做前者可能更容易。您可能还想实现自定义密钥序列化程序,以确保密钥是正确格式的序列化程序。
注册序列化器和反序列化器的最简单方法是通过在 Jackson 1.7 中添加的 模块接口(并在 1.8 中扩展以支持关键序列化器/反序列化器)。