首頁  >  文章  >  Java  >  如何在 Java 中使用 Jackson 反序列化 JSON 物件中的泛型類型?

如何在 Java 中使用 Jackson 反序列化 JSON 物件中的泛型類型?

Barbara Streisand
Barbara Streisand原創
2024-10-31 01:05:29828瀏覽

 How do I deserialize a generic type within a JSON object using Jackson in Java?

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

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