使用Jackson As.External_Property和Collection

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Jackson As.External_Property和Collection相关的知识,希望对你有一定的参考价值。

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

答案

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

以上是关于使用Jackson As.External_Property和Collection的主要内容,如果未能解决你的问题,请参考以下文章

Jackson使用手册

Jackson 使用简介

fastxml Jackson annotation使用小记

# Jackson 学习使用

Jackson的使用

转换JSON工具——Jackson的简单使用