jackson无法序列化多态对象列表

时间:2017-09-07 14:13:44

标签: java json jackson json-deserialization

我有一个抽象类,我需要将其序列化为项目列表,并通过网络以json格式发送。

@JsonTypeInfo(
    use=JsonTypeInfo.Id.NAME,
    include= As.PROPERTY,
    property="searchMatchType",
    defaultImpl = NoClass.class,
    visible = true)
@JsonSubTypes({
    @Type(value = Match.class, name = "MATCH"),
    @Type(value = SynonymMatchA.class, name = "SYNONYM_MATCH_A"),
    @Type(value = SynonymMatchB.class, name = "SYNONYM_MATCH_B")
})
public abstract class SearchResult {

    private TypeA typeA;

    private SearchMatchType searchMatchType;

    @JsonCreator
    public SearchResult(
           @JsonProperty("searchMatchType") SearchMatchType searchMatchType,
           @JsonProperty("typeA") TypeA typeA) {
        this.searchMatchType = searchMatchType;
        this.typeA = typeA;
    }  
}

我知道我们无法在java中序列化对象列表,因为java complier在编译时应用了类型擦除。所以我创建了一个如下所示的包装类,并从主控制器而不是列表中返回。

public class SearchResultList {

    private final List<SearchResult> searchResults;

    @JsonCreator
    public SearchResultList(
          @JsonProperty("searchResults") List<SearchResult> searchResults) {
        this.searchResults = searchResults;
    }
}

我使用MATCH,SYNONYM_MATCH_A和SYNONYM_MATCH_B类型的对象填充列表,这些对象是SearchResult类的子类型。 现在在json中,我能够看到基类字段,但无法看到MATCH,SYNONYM_MATCH_A和SYNONYM_MATCH_B类的派生类字段。当我检查服务器上的列表而不是从列表中序列化的json时,我能够看到这些完整的对象。

1 个答案:

答案 0 :(得分:0)

我没有在派生类的字段中使用getter,因此jackson在从对象序列化为json格式时无法获取字段的值。一旦我放入吸气剂,它就能够正确序列化。