Java Jackson@JsonTypeInfo属性采用字符串值
假设我有一些类似的JSONJava Jackson@JsonTypeInfo属性采用字符串值,java,jackson,Java,Jackson,假设我有一些类似的JSON [ { 'type' : { 'value': 'B' } }, { 'type' : { 'value': 'C' } } ] 是否可以使用jackson使用types值属性来告诉jackson对象是什么多态类型?例如,我尝试过类似的方法,但没有任何运气 @JsonTypeInfo(use = JsonTypeInfo
[
{
'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中的另一个对象中的
字符串来识别类型。您可以始终使用自定义反序列化器来实现这类功能。它将如下所示:
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
的派生类,以避免再次调用相同的自定义反序列化程序(stackoverflowerrror
)
对于上述内容,无需使用@JsonTypeName
、@JsonTypeInfo
和@JsonSubTypes
我看了一些其他选项,如自定义和扩展,但在您的情况下,这两个选项都不能工作。您可以修改JSON结构、类结构或两者都可以吗?JSON必须保持不变,但类结构可以更改。我想这可能归结为类似的问题!非常感谢。
@JsonDeserialize(using = ADeserializer.class)
abstract class A {
@JsonDeserialize
class B extends A {