jackson多态反序列化 – 您是否可以要求存在字段而不是特定值?

在动物园示例中使用旋转:

public class ZooPen { public String type; public List animals; } public class Animal { public String name; public int age; } public class Bird extends Animal { public double wingspan; } 

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

 @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 { ... } 

翼展值可以是任何东西,如果没有特定匹配的东西,jackson会回到defaultImpl类。

我可以使用@JsonCreator

 @JsonCreator public static Animal create(Map jsonMap) throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); if (jsonMap.get("wingspan") == null) { // Construct and return animal } else { // Construct and return bird } } 

但是,我必须手动处理额外的值并抛出一致的exception,并且不清楚Animal是否会在以后正确序列化。

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

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

如果你没有和jackson结婚,我相信使用FlexJSON可以实现与此类似的东西。

http://flexjson.sourceforge.net/javadoc/flexjson/JSONDeserializer.html

我不熟悉Jackson执行类似操作的方法,但我可以说FlexJSON非常高效,并且在序列化/反序列化步骤中通常很直观。