【问题标题】:jackson not able to serialize a list of polymorphic objects杰克逊无法序列化多态对象列表
【发布时间】:2017-09-07 14:13:43
【问题描述】:

我有一个抽象类,我需要将其序列化为项目列表并以 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 编译器在编译时应用了类型擦除。所以我创建了一个如下的包装类,并从主控制器而不是列表返回它。

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 中时,我能够看到这些完整的对象。

【问题讨论】:

    标签: java json jackson json-deserialization


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 2015-05-13
      • 1970-01-01
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多