java - jsontypeinfo



杰克逊多态反序列化-你可以要求存在一个字段而不是一个特定的值? (1)

在动物园的例子中使用旋转:

public class ZooPen {
    public String type;
    public List<Animal> animals;
}

public class Animal {
    public String name;
    public int age;
}

public class Bird extends Animal {
    public double wingspan;
}

如果没有指定翼展,我想使用多态反序列化来构造Animal实例,如果是的话,则使用Bird实例。 在杰克逊,无类型的反序列化通常看起来像这样:

@JsonTypeInfo( 
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "wingspan",
    visible = true,
    defaultImpl = Animal.class
)
@JsonSubTypes({
    @Type(value = Bird.class, name = **???**)
})  
public class Animal {
    ...
}

这个翼展值可以是任何东西,如果没有特别的匹配,杰克逊就会回到defaultImpl类。

我可以使用@JsonCreator

@JsonCreator
public static Animal create(Map<String,Object> jsonMap) 
        throws JsonProcessingException {

    ObjectMapper mapper = new ObjectMapper();
    if (jsonMap.get("wingspan") == null) {
        // Construct and return animal
    } else {
        // Construct and return bird
    }
}

然而,那么我不得不手动处理额外的值并抛出一致的异常,并且不清楚动物是否会在稍后被正确序列化。

有没有办法做我想与多态的类型处理? 看来我可以使用我自己的TypeResolver或TypeIdResolver,但是这似乎更多的工作,而不仅仅是反序列化原始json自己。 或者,可能有一种方法来定位动物园笔的类型,即使它在父对象中。 有任何想法吗?

编辑:
TypeResolver和TypeIdResolver似乎本质上认为类型信息是序列化的,所以这些都不好用。 实现我自己的JsonDeserializer来挂钩生命周期来指定类型,但仍然使用基本的jackson注释处理功能是否可行? 我一直在看JsonDeserializer.deserializeWithType(...) ,但似乎委托反序列化完全到一个TypeDeserializer。 在我知道使用哪种类型之前,还需要反序列化一些对象。






deserialization