假设我有一些像这样的 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;
}
最佳答案
Jackson 似乎不支持使用嵌套在 JSON 中另一个对象中的 String
来辨别类型。您始终可以使用自定义反序列化器来完成此类操作。它看起来像这样:
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但无法让其中任何一个在您的情况下工作。
关于java - Jackson @JsonTypeInfo property 属性采用字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45009309/