Jackson 和泛型型別參考
在 Java 中,泛型用來表示可以用其他型別參數化的型別。這允許程式碼重用和更大的靈活性。然而,當使用 Jackson 處理 JSON 時,泛型類型可能會帶來某些挑戰。
存取 JSON 物件中的泛型屬性時會出現一個常見問題。考慮以下 Java 程式碼:
<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(); } public class MyWrapper<T> { private MyRequest<T> request; public MyRequest<T> getRequest() { return request; } public void setRequest(MyRequest<T> request) { this.request = request; } } public class MyRequest<T> { private List<T> myobjects; public void setMyObjects(List<T> ets) { this.myobjects = ets; } @NotNull @JsonIgnore public T getMyObject() { return myobjects.get(0); } }</code>
當呼叫 MyRequest 物件內的 getMyObject() 時,Jackson 會將巢狀的自訂物件作為 LinkedHashMap 傳回。這是因為 Jackson 無法僅根據泛型聲明來確定 T 的實際類型。
要解決此問題並指定 T 的類型,需要明確類別參數。這可以透過建構一個 JavaType 物件來完成,如下所示:
<code class="java">TypeReference<MyWrapper<T>> typeRef = new TypeReference<MyWrapper<T>>() {}; JavaType type = mapper.getTypeFactory().constructCollectionType(List.class, Foo.class); MyWrapper<Foo> requestWrapper = mapper.readValue(jsonRequest, type);</code>
在此範例中,Foo 類別表示 T 的實際類型。透過建構具有所需類型的 JavaType,Jackson 可以正確地反序列化JSON 物件並傳回正確類型的 T.
以上是如何在 Java 中使用 Jackson 反序列化 JSON 物件中的泛型類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!