Java 反序列化顶级对象中id类型为的子对象

Java 反序列化顶级对象中id类型为的子对象,java,json,jackson,deserialization,Java,Json,Jackson,Deserialization,我正在使用Jackson尝试反序列化此数据结构: { "type": "foo", // or "bar", "baz", etc "name": "number 1", "params": { // parameters specific to type 'foo' } } 我知道我可以使用自定义反序列化程序,但我想知道是否可以仅使用@JsonType*注释族来实现这一点 现在我的课程设置如下: public class TopLevelObject {

我正在使用Jackson尝试反序列化此数据结构:

{
  "type": "foo",       // or "bar", "baz", etc
  "name": "number 1",
  "params": {
    // parameters specific to type 'foo'
  }
}
我知道我可以使用自定义反序列化程序,但我想知道是否可以仅使用
@JsonType*
注释族来实现这一点

现在我的课程设置如下:

public class TopLevelObject {
    String type;
    String name;
    AbstractParams params;
}

public class FooParams extends AbstractParams {
    String one;
    String two;
}

public class BarParams extends AbstractParams {
    String three;
    String four;
}

abstract public class AbstractParams {
}
如果我将属性移动到
AbstractParams
类中,我可以在
type
属性上使用
@JsonTypeInfo
,但是在
TopLevelObject
中保留
type
属性时,我似乎无法获得相同的结果


有什么想法吗?

可以使用
@JsonTypeInfo(use=Id.NAME,include=As.EXTERNAL\u属性)
。但是,
As.EXTERNAL\u属性
只能用于属性

因此,您必须将
@JsonTypeInfo
注释放在
TopLevelObject
类的
AbstractParams
字段/setter上

class TopLevelObject {
    public String type;
    public String name;

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
            include= JsonTypeInfo.As.EXTERNAL_PROPERTY,
            property = "type")
    @JsonSubTypes({
            @JsonSubTypes.Type(value = FooParams.class, name = "foo"),
            @JsonSubTypes.Type(value = BarParams.class, name = "bar")})
    public AbstractParams params;

}

可以使用
@JsonTypeInfo(use=Id.NAME,include=As.EXTERNAL\u属性)
。但是,
As.EXTERNAL\u属性
只能用于属性

因此,您必须将
@JsonTypeInfo
注释放在
TopLevelObject
类的
AbstractParams
字段/setter上

class TopLevelObject {
    public String type;
    public String name;

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
            include= JsonTypeInfo.As.EXTERNAL_PROPERTY,
            property = "type")
    @JsonSubTypes({
            @JsonSubTypes.Type(value = FooParams.class, name = "foo"),
            @JsonSubTypes.Type(value = BarParams.class, name = "bar")})
    public AbstractParams params;

}

太好了,这正是我想要的!非常感谢。太好了,这正是我想要的!非常感谢。