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

时间:2017-10-27 20:07:53

标签: java json jackson deserialization

我使用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类的同时,我似乎无法获得相同的结果{1}}中的{1}}属性。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

因此,您必须在@JsonTypeInfo类的AbstractParams字段/ setter上添加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;

}