java - Jackson @JsonTypeInfo property 属性采用字符串值

标签 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;
}

最佳答案

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

我查看了其他一些选项,例如自定义 JsonTypeIdResolverthis answer延伸AsPropertyTypeDeserializer但无法让其中任何一个在您的情况下工作。

关于java - Jackson @JsonTypeInfo property 属性采用字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45009309/

相关文章:

java - Eclipse "Class File Editor"调试时找不到源

java - 如何从我的 Dropwizard 资源中访问已包装在自定义类中的请求?

java - Spring MVC 项目在 Eclipse 中部署到 Tomcat 时缺少图像和样式

java - 如何动态忽略json属性

java - 使用 Jackson 序列化时的前缀字段

java - Jackson 反序列化空数组失败

java - Jackson 在 Spring Boot 中反序列化 GeoJson Point

java - 删除按钮的矩形边框

java - JFugue 5 音符问题

java - 使用注释的 Jackson 多态反序列化