我正在尝试使用JSON ObjectMapper反序列化对象,但在尝试反序列化时出现以下错误。
com.fasterxml.jackson.databind.JsonMappingException: 无法构建 com.phoenix.types.OrderItem 的实例:抽象类型需要映射到具体类型,具有自定义反序列化器,或包含附加类型信息 [来源:java.io.StringReader@4bb33f74; 行:112,列:7](通过引用链:com.phoenix.types.GenerateRequest ["order"] - >com.phoenix.types.Order ["orderItems"] - > Object [] [0]) 在 com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:261) 在 com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:1456) 在 com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1012) 在 com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserialize(AbstractDeserializer.java:149) 在 com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:196) 在 com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:20) 在 com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:499) 在 com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:101) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:276) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:140) 在 com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:499) 在 com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:101) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:276) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:140) 在 com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3789) 在 com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2833)
com.fasterxml.jackson.databind.JsonMappingException: 无法构建 com.phoenix.types.OrderItem 的实例:抽象类型需要映射到具体类型,具有自定义反序列化器,或包含附加类型信息 [来源:java.io.StringReader@4bb33f74; 行:112,列:7](通过引用链:com.phoenix.types.GenerateRequest ["order"] - >com.phoenix.types.Order ["orderItems"] - > Object [] [0]) 在 com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:261) 在 com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:1456) 在 com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1012) 在 com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserialize(AbstractDeserializer.java:149) 在 com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:196) 在 com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:20) 在 com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:499) 在 com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:101) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:276) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:140) 在 com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:499) 在 com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:101) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:276) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:140) 在 com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3789) 在 com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2833)
我遇到了一个文章, 介绍了多态反序列化的解决方案。这基本上提供了解决上述错误的方法。用于反序列化的类(在此例中为OrderItem等)是jar文件的一部分。然而,是否有一种方法可以在尝试进行反序列化时将JsonDeserialize定义为objectmapper的一部分,而不是向类本身添加注释,因为我无法访问它。
ObjectMapper
而不是强制转换ObjectCodec
,但是我在脑海中找到它有些困难。你也可以手动构造具体的实例,但我想避免这样做的工作。 - Andrew Rueckertfinal
。我不明白为什么人们只将其用于“常量”。除非无法,否则每个变量都应该是final
(在我看来)。 - MuffinTheMan