首頁 > Java > java教程 > 主體

如何使用 Jackson 將 JSON 反序列化為多態類型:解決「無法直接映射」編譯錯誤?

Patricia Arquette
發布: 2024-11-12 07:54:01
原創
736 人瀏覽過

How to Deserialize JSON into Polymorphic Types with Jackson: Resolving the

使用Jackson 將JSON 反序列化為多態性類型:解決編譯錯誤

試圖解決使用Jackson 的ObjectMapper 反序列化多態性類型:解決編譯錯誤

試圖解決使用Jackson 的ObjectMapper 反序列化多態類型:解決編譯錯誤

return mapper.readValue(root, animalClass);
登入後複製
試圖解決使用Jackson 的ObjectMapper 反序列化多態性類型:罪魁禍首在於readValue() 方法的參數型別不符。

有問題的行是:

通用 readValue() 方法需要 TypeReference 或 Class 作為第二個參數,但 AnimalClass是 Class,編譯器無法直接對應。

使用註解的解決方案:

要解決此錯誤並允許多態反序列化,我們可以利用 Jackson 的 JSON 註解。在這種方法中,使用了 @JsonTypeInfo、@JsonSubTypes 和 @JsonIgnoreProperties 註解。

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
@JsonSubTypes({
    @JsonSubTypes.Type(value = Dog.class, name = "Dog"),
    @JsonSubTypes.Type(value = Cat.class, name = "Cat")
}
public abstract class Animal {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
登入後複製
修改Animal 類及其子類,如下圖:

Animal 類:
public class Dog extends Animal {

    private String breed;

    public Dog() {

    }

    // Constructors and getters/setters omitted for brevity

}

public class Cat extends Animal {

    private String favoriteToy;

    // Constructors and getters/setters omitted for brevity


}
登入後複製

狗和貓子類:
return mapper.readValue(root, Animal.class);
登入後複製
透過這些註釋,Jackson 現在可以正確地將多態JSON 資料反序列化為適當的子類別。更正後的 readValue() 行將是:

以上是如何使用 Jackson 將 JSON 反序列化為多態類型:解決「無法直接映射」編譯錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板