说我有一些像这样的JSON
[
{
'type' : {
'value': 'B'
}
},
{
'type' : {
'value': 'C'
}
}
]
是否可以使用jackson使用types值属性来告诉jackson对象是什么多态类型?例如,我已经尝试了一些没有任何运气的东西
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.Property, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(name = "B", value = B.class),
@JsonSubTypes.Type(name = "C", value = C.class)
}
)
abstract class A {
private Type type;
}
@JsonTypeName(value = "B")
class B extends A {
}
@JsonTypeName(value = "C")
class C extends A {
}
class Type {
private String value;
}
答案 0 :(得分:1)
使用嵌套在JSON中的另一个对象中的String
来识别该类型似乎不受Jackson的支持。您可以随时使用自定义反序列化程序。它看起来像这样:
class ADeserializer extends JsonDeserializer<A> {
@Override public A deserialize(JsonParser p, DeserializationContext ctx) throws IOException {
ObjectMapper mapper = (ObjectMapper) p.getCodec();
ObjectNode node = mapper.readTree(p);
String value = node.get("type").get("value").asText();
switch (value) {
case "B": return mapper.treeToValue(node, B.class);
case "C": return mapper.treeToValue(node, C.class);
default: return null;
}
}
}
并使用它来注释抽象类以指定反序列化器:
@JsonDeserialize(using = ADeserializer.class)
abstract class A {
以及带有空@JsonDeserialize
的派生类,以避免再次调用相同的自定义反序列化程序(StackOverflowError
)。
@JsonDeserialize
class B extends A {
上述内容无需@JsonTypeName
,@JsonTypeInfo
和@JsonSubTypes
。
我查看了一些其他选项,例如自定义JsonTypeIdResolver和this answer,这些选项延伸AsPropertyTypeDeserializer,但无法在您的案例中使用其中任何一个。< / p>