【发布时间】:2015-01-23 00:54:20
【问题描述】:
我使用 Jackson 序列化 Map<Class<?>, BaseClass>。 BaseClass 有多个子类,每个子类都经过适当的注解以供 Jackson 序列化/反序列化。
- 是否可以调用
ObjectMapper.readValue(file, Subclass.class)并返回Subclass实例? - 如果是这样,我该如何避免这个异常?
com.fasterxml.jackson.databind.JsonMappingException: Can not find a (Map) Key deserializer for type [simple type, class java.lang.Class<java.lang.Object>]
at com.fasterxml.jackson.databind.deser.DeserializerCache._handleUnknownKeyDeserializer(DeserializerCache.java:578)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findKeyDeserializer(DeserializerCache.java:168)
at com.fasterxml.jackson.databind.DeserializationContext.findKeyDeserializer(DeserializationContext.java:404)
at com.fasterxml.jackson.databind.deser.std.MapDeserializer.createContextual(MapDeserializer.java:231)
at com.fasterxml.jackson.databind.DeserializationContext.handleSecondaryContextualization(DeserializationContext.java:581)
at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:369)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer.findDeserializer(StdDeserializer.java:842)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:514)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:292)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:241)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:381)
at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:3154)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3047)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2100)
- Jackson 不应该知道如何反序列化
Class<?>,因为它是核心 JDK 类型吗?
更新:我找到了https://stackoverflow.com/a/13954871/14731,它讨论了如何在 Jackson 中实现多态性。这回答了问题 #1,但给我们留下了问题 #2 和 #3。
UPDATE2:很有趣。我找到了ClassSerializer.java,但是https://github.com/FasterXML/jackson-databind/tree/master/src/main/java/com/fasterxml/jackson/databind/deser/std中没有对应的ClassDeserializer.java
UPDATE3:提交错误报告:https://github.com/FasterXML/jackson-databind/issues/630
【问题讨论】: