Jackson 在序列化时不包含字段的类型信息

Aks*_*rma 1 java json jackson fasterxml

我正在尝试使用 jackson 2.6.3 将对象序列化为 json 我想在序列化的 json 中包含类型信息。这不适用于嵌套在此类中的成员。

这是测试代码。

public class Test {

@JsonSubTypes({ @JsonSubTypes.Type(value = ConcreteA.class)})
interface A {

}
@JsonTypeInfo( use=JsonTypeInfo.Id.CLASS)
class ConcreteA implements A {

}

@JsonSubTypes({ @JsonSubTypes.Type(value = ConcreteB.class)})
interface B {

}
@JsonTypeInfo( use=JsonTypeInfo.Id.CLASS)
class ConcreteB implements B {
    A a;
    public A getA() {
        return a=new ConcreteA();
    }
}

@org.junit.Test
public void testSerialisation() throws JsonProcessingException {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
    System.out.println(objectMapper.writeValueAsString(new ConcreteB()));
}
}
Run Code Online (Sandbox Code Playgroud)

jackson 正在转换的 json 是

{"@class":"Test$ConcreteB","a":{}}
Run Code Online (Sandbox Code Playgroud)

请注意,它不包括字段“a”的类型信息。仅序列化 A 时确实包含类型信息。

{"@class":"Test$ConcreteA"} 
Run Code Online (Sandbox Code Playgroud)

更新:这是 jackson dev 对这个问题的解释和解决方案 https://github.com/FasterXML/jackson-databind/issues/1015

jba*_*eta 5

看起来您已经很接近了,您需要添加的只是一种告诉 jackson 如何处理您的接口类型的方法。

@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.PROPERTY,
        property = "@class")
@JsonSubTypes({
        @JsonSubTypes.Type(value = ConcreteA.class)})
interface A {
}
Run Code Online (Sandbox Code Playgroud)

因此,将 添加@JsonTypeInfo到您的界面会将类型信息添加到您可以配置为您期望的属性中,在本例中我选择了@class

我从我的例子中得到的 Json 输出:

{"@class":"com.company.jackson.Test$ConcreteB","a":{"@type":"Test$ConcreteA"}}

希望能帮助到你,

何塞·路易斯