Jackson @JsonTypeInfo属性属性假定字符串值

时间:2017-07-10 10:10:08

标签: java jackson

说我有一些像这样的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;
}

1 个答案:

答案 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

我查看了一些其他选项,例如自定义JsonTypeIdResolverthis answer,这些选项延伸AsPropertyTypeDeserializer,但无法在您的案例中使用其中任何一个。< / p>