杰克逊无法序列化多态对象列表
jackson not able to serialize a list of polymorphic objects
我有一个摘要 class,我需要将其序列化为项目列表并以 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 编译器在编译时应用类型擦除。所以我创建了一个包装器 class 如下所示,并从主控制器而不是列表返回它。
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 class 的子类型。
现在在 json 中,我可以看到基础 class 字段,但看不到来自 classes MATCH、SYNONYM_MATCH_A 和 [=19 的派生 class 字段=].当我检查服务器上的列表而不是从列表序列化的 json 中时,我能够看到这些完整的对象。
我没有对派生的 class 中的字段使用 getter,因此 jackson 在从对象序列化为 json 格式时无法获取字段的值。一旦我放置了吸气剂,它就能够正确序列化。
我有一个摘要 class,我需要将其序列化为项目列表并以 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 编译器在编译时应用类型擦除。所以我创建了一个包装器 class 如下所示,并从主控制器而不是列表返回它。
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 class 的子类型。 现在在 json 中,我可以看到基础 class 字段,但看不到来自 classes MATCH、SYNONYM_MATCH_A 和 [=19 的派生 class 字段=].当我检查服务器上的列表而不是从列表序列化的 json 中时,我能够看到这些完整的对象。
我没有对派生的 class 中的字段使用 getter,因此 jackson 在从对象序列化为 json 格式时无法获取字段的值。一旦我放置了吸气剂,它就能够正确序列化。