简体   繁体   中英

Can not find a (Map) Key deserializer for type [simple type, class java.lang.Class<java.lang.Object>]

I used Jackson to serialize a Map<Class<?>, BaseClass> . There are multiple subclasses of BaseClass , and each one is properly annotated to be serialized/deserialized by Jackson.

  1. Is it possible to invoke ObjectMapper.readValue(file, Subclass.class) and get a Subclass instance back?
  2. If so, how do I avoid this exception?
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)
  1. Shouldn't Jackson know how to deserialize Class<?> since it is a core JDK type?

UPDATE : I found https://stackoverflow.com/a/13954871/14731 which discusses how to implement Polymorphism in Jackson. That answers question #1 but leaves us with questions #2 and #3.

UPDATE2 : Interesting. I found ClassSerializer.java but there is no corresponding ClassDeserializer.java in https://github.com/FasterXML/jackson-databind/tree/master/src/main/java/com/fasterxml/jackson/databind/deser/std

UPDATE3 : Filed a bug report: https://github.com/FasterXML/jackson-databind/issues/630

这是一个已知的错误,应该在2.5.0版本中修复: https//github.com/FasterXML/jackson-databind/issues/630

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM