是否可以根据JSON的内容使用Jackson将JSON反序列化为两种类型之一?
例如,我有以下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完成此操作而不包括类型ID?
答案 0 :(得分:6)
这些是实现Id
的唯一两个类吗?如果是这样,您可以编写IdDeserializer
类并将@JsonDeserialize(using = IdDeserializer.class)
放在Id
接口上,反序列化器将查看JSON并确定要反序列化的对象。
编辑:JsonParser正在流媒体,所以看起来应该是这样的:
public Id deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
ObjectNode node = jp.readValueAsTree();
Class<? extends Id> concreteType = determineConcreteType(node); //Implement
return jp.getCodec().treeToValue(node, concreteType);
}
答案 1 :(得分:0)
使用@JsonIgnore
注释您的方法@JsonIgnore
Thing toThing() {
new PackageIdentifiedThing(packageId, thingId)
}
答案 2 :(得分:0)
使用Jackson2,您可以使用泛型轻松编组到不同的类:
key