是否有可能使用Jackson将JSON反序列化为基于JSON内容的两种类型之一?Jackson根据对象属性反序列化为POJO
例如,我有以下的Java(技术上的Groovy,但是这并不重要)接口和类:
interface Id {
Thing toThing()
}
class NaturalId implements Id {
final String packageId
final String thingId
Thing toThing() {
new PackageIdentifiedThing(packageId, thingId)
}
}
class AlternateId implements Id {
final String key
Thing toThing() {
new AlternatelyIdentifiedThing(key)
}
}
我会收到看起来要么以下的JSON:
这JSON应该映射到NaturalId {"packageId": "SomePackage", "thingId": "SomeEntity"}
这JSON应该映射到AlternateId {"key": "SomeUniqueKey"}
有没有人知道我可以用Jackson 2.x来完成这项工作,而不包括type id的?
此刻;只有这两个。在不久的将来可能会有三分之一,但我预计不会出现Id类型的爆炸式增长。 我打算查看自定义的Deserializer方法,因为它可能是最有效的。 – 2013-04-05 14:59:35
我建议你的反序列化器只应该算出'Id'要反序列化到哪个实现,然后委托给Jackson反序列化为具体类型。这将使得任何有关具体类型的杰克逊注解仍然受到尊重。 (确保在具体类型上放置'@JsonDeserialize(using = None.class)'以避免无限的反序列化循环) – HiJon89 2013-04-05 19:12:11
HiJon是个好主意,但我似乎遇到了这样的问题;当我调用mapper.readValue(jsonParser,ConcreteType)时,出现以下错误:“由于输入结束而无法映射”,其中jsonParser是传入反序列化方法的那个,而ConcreteType是我确定的类型是正确的。有任何想法吗?我有一种感觉,它与API的流式性质有关。 – 2013-04-05 22:47:44