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中文網其他相關文章!