Java Jackson@JsonTypeInfo属性采用字符串值

Java Jackson@JsonTypeInfo属性采用字符串值,java,jackson,Java,Jackson,假设我有一些类似的JSON [ { 'type' : { 'value': 'B' } }, { 'type' : { 'value': 'C' } } ] 是否可以使用jackson使用types值属性来告诉jackson对象是什么多态类型?例如,我尝试过类似的方法,但没有任何运气 @JsonTypeInfo(use = JsonTypeInfo

假设我有一些类似的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中的另一个对象中的
字符串来识别类型。您可以始终使用自定义反序列化器来实现这类功能。它将如下所示:

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 {