Heim  >  Artikel  >  Java  >  Wie deserialisiere ich einen generischen Typ innerhalb eines JSON-Objekts mit Jackson in Java?

Wie deserialisiere ich einen generischen Typ innerhalb eines JSON-Objekts mit Jackson in Java?

Barbara Streisand
Barbara StreisandOriginal
2024-10-31 01:05:29828Durchsuche

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

Jackson und generische Typreferenz

In Java werden Generika verwendet, um Typen darzustellen, die mit anderen Typen parametrisiert werden können. Dies ermöglicht die Wiederverwendung von Code und eine größere Flexibilität. Bei der Arbeit mit JSON mithilfe von Jackson können generische Typen jedoch bestimmte Herausforderungen mit sich bringen.

Ein häufiges Problem tritt beim Zugriff auf generische Eigenschaften innerhalb eines JSON-Objekts auf. Betrachten Sie den folgenden Java-Code:

<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>

Beim Aufruf von getMyObject(), das sich im MyRequest-Objekt befindet, gibt Jackson das verschachtelte benutzerdefinierte Objekt als LinkedHashMap zurück. Dies liegt daran, dass Jackson den tatsächlichen Typ von T nicht allein anhand der generischen Deklaration bestimmen kann.

Um dieses Problem zu lösen und den Typ von T anzugeben, ist ein explizites Klassenargument erforderlich. Dies kann durch die Konstruktion eines JavaType-Objekts wie folgt erfolgen:

<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>

In diesem Beispiel stellt die Foo-Klasse den tatsächlichen Typ von T dar. Durch die Konstruktion eines JavaType mit dem gewünschten Typ kann Jackson das ordnungsgemäß deserialisieren JSON-Objekt und geben Sie den richtigen T-Typ zurück.

Das obige ist der detaillierte Inhalt vonWie deserialisiere ich einen generischen Typ innerhalb eines JSON-Objekts mit Jackson in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn