使用Jackson As.External_Property和Collection

时间:2017-12-17 15:23:12

标签: java json jackson

尝试使用JsonTypeInfo.As.EXTERNAL_PROPERTY序列化(然后反序列化)包含子类型列表的容器。 我得到了

com.fasterxml.jackson.core.JsonGenerationException: Can not write a field name, expecting a value

杰克逊试图写集合时(elements

public class Container {

public static final TypeReference<Container> CONTAINER_REF = new TypeReference<Container>() {
    // nothing extra
};

@JsonTypeInfo(use = Id.NAME, include = As.EXTERNAL_PROPERTY)
@JsonSubTypes({
      @Type(value = ChildOne.class, name = "childOne"),
      @Type(value = ChildTwo.class, name = "childTwo"),
      })
private List<? extends Parent<?>> elements;

public Container() {
   super();
}

public List<? extends Parent<?>> getElements() {
    return elements;
}

public void setElements(List<? extends Parent<?>> elements) {
    this.elements = elements;
}

}

@JsonSubTypes({
@Type(value = ChildOne.class, name = "childOne"),
@Type(value = ChildTwo.class, name = "childTwo"),
})
public abstract class Parent<T> {

public Parent() {
    super();
}

public abstract T getSomething();

public static class ChildOne extends Parent<String> {
    public ChildOne() {
        super();
    }

    @Override
    public String getSomething() {
        return "lala";
    }
}

public static class ChildTwo extends Parent<Long> {
    public ChildTwo() {
        super();
    }

    @Override
    public Long getSomething() {
        return 764L;
    }
}

}

请注意,我希望type属性容器的一部分,而 属于集合中的每个项目。

修改

我最终使用JsonTypeInfo.As.Property,使用了Containertype两个子类,每个子类必须实现返回它的类名< / p>

1 个答案:

答案 0 :(得分:0)

这是不可能的。您的Collection声明可以指示统一的非多态类型,也可以指示多态类型的基础。但它不能强制内容。