我正在使用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 {
}


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

有任何想法吗?

最佳答案

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

因此,您必须在@JsonTypeInfo类的AbstractParams字段/设置者上放置TopLevelObject批注

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;

}

08-04 22:39