我有一个抽象类,我需要将其序列化为项目列表,并通过网络以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时,我能够看到这些完整的对象。
答案 0 :(得分:0)
我没有在派生类的字段中使用getter,因此jackson在从对象序列化为json格式时无法获取字段的值。一旦我放入吸气剂,它就能够正确序列化。