首頁  >  文章  >  Java  >  如何使用 Jackson 的 ObjectMapper 反序列化多型態 JSON 而不會出現編譯錯誤?

如何使用 Jackson 的 ObjectMapper 反序列化多型態 JSON 而不會出現編譯錯誤?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-24 16:36:11794瀏覽

How to Deserialize Polymorphic JSON Using Jackson's ObjectMapper without Compilation Errors?

Jackson 和多態性JSON:解決ObjectNode 反序列化的編譯錯誤

此查詢旨在解決使用Jackson 反序列化多態性JSON 時遇到的編譯錯誤物件映射器。具體來說,錯誤在於以下行:

return mapper.readValue(root, animalClass);

問題解釋:

錯誤源自於readValue() 的方法簽章與參數之間的不符假如。 readValue() 需要兩個參數:一個 JsonParser 和一個 Class,但在這段程式碼中,傳遞的是一個 ObjectNode(不是 JsonParser)和 Animal 的子型別(不是 Animal 本身)。

註解-基於多態性的解決方案:

作為教程中提到的基於註冊表的方法的替代方案,請考慮使用Jackson 的基於註釋的多態反序列化方法。這涉及:

  1. 註解 Animal 類別: 使用 @JsonTypeInfo 定義類型資訊如何儲存在 JSON 中,並使用 @JsonSubTypes 指定可能的子類型。
  2. 註解子類別(例如 Dog 和 Cat): 使用@JsonTypeId 定義保存類型資訊的屬性的名稱。

範例實作:

// An abstract base class for animals
@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 { ... }

// Subclass for dogs
public class Dog extends Animal { ... }

// Subclass for cats
public class Cat extends Animal { ... }

// Test class
public class Test {

  public static void main(String[] args) {
    ObjectMapper mapper = new ObjectMapper();
    ... // Serialize and deserialize animals as shown in the provided solution
  }
}

透過使用註釋,Jackson 可以推斷根據JSON 中提供的類型資訊來確定物件的類型,無需註冊表並解決編譯錯誤。

以上是如何使用 Jackson 的 ObjectMapper 反序列化多型態 JSON 而不會出現編譯錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn