使用Jackson As.External_Property和Collection

问题描述 投票:0回答:1

尝试使用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,有两个Container子类和一个type属性,每个子类必须实现返回它的类名

java json jackson
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.