首頁  >  文章  >  Java  >  如何使用 Jackson 反序列化巢狀通用物件:使用 TypeReference 和 JavaType 的指南

如何使用 Jackson 反序列化巢狀通用物件:使用 TypeReference 和 JavaType 的指南

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-26 00:00:03529瀏覽

How to Deserialize Nested Generic Objects with Jackson:  A Guide to Using TypeReference and JavaType

Jackson 和泛型類型參考:處理巢狀泛型物件

Jackson JSON 函式庫允許對複雜物件結構進行強大的處理。然而,在自訂物件中使用泛型類型時會出現一個常見的挑戰。

問題陳述:

考慮以下程式碼:

<code class="java">public class MyWrapper<T> {

    private MyRequest<T> request;

    // ... getters and setters
}

public class MyRequest<T> {

    private List<T> myobjects;

    // ... getters and setters
}</code>

通用方法嘗試將JSON 物件反序列化為MyWrapper 實例:

實例:
<code class="java">public MyRequest<T> tester() {
    TypeReference<MyWrapper<T>> typeRef = new TypeReference<MyWrapper<T>>();
    MyWrapper<T> requestWrapper = (MyWrapper<T>) JsonConverter.fromJson(jsonRequest, typeRef);
    return requestWrapper.getRequest();
}</code>

在巢狀MyRequest 物件上呼叫getMyObject() 時會出現此問題。 Jackson 傳回一個 LinkedHashMap,而不是所需類型 T 的實例。發生這種情況是因為 Java 類型擦除在編譯期間刪除了類型資訊。

解決方案:

指定要傳回確切的類型 T,您需要向 Jackson 提供有關該類型的附加資訊。這可以透過使用 Jackson 映射器中的 JavaType 類別來實現。
<code class="java">JavaType type = mapper.getTypeFactory().
  constructCollectionType(List.class, Foo.class);</code>

將 tester() 方法中的行替換為:
<code class="java">TypeReference<MyWrapper<T>> typeRef = new TypeReference<MyWrapper<T>>();
JavaType requestType = mapper.getTypeFactory().
  constructCollectionType(MyRequest.class, type.getType());
MyWrapper<T> requestWrapper = 
  (MyWrapper<T>) JsonConverter.fromJson(jsonRequest, requestType);</code>

這現在指示 Jackson 期望給定類型 Foo 的列表。反序列化 JSON 物件時,它會將其轉換為正確的類型。

透過向 Jackson 提供此附加類型信息,您可以準確處理嵌套的泛型對象,確保檢索時對象的類型正確。

以上是如何使用 Jackson 反序列化巢狀通用物件:使用 TypeReference 和 JavaType 的指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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