Heim  >  Artikel  >  Java  >  Wie deserialisiere ich verschachtelte generische Objekte in Jackson mit Type Erasure?

Wie deserialisiere ich verschachtelte generische Objekte in Jackson mit Type Erasure?

DDD
DDDOriginal
2024-10-28 16:15:43838Durchsuche

How to Deserialize Nested Generic Objects in Jackson with Type Erasure?

Jackson und generische Typreferenz

Beim Versuch, Jacksons JSON-Bibliothek mit generischen Methoden zu verwenden, kann es bei Entwicklern zu einem Problem kommen, bei dem ein benutzerdefiniertes Objekt verschachtelt ist wird als LinkedHashMap anstelle seiner eigentlichen Klasse zurückgegeben. Dieses Problem entsteht durch Javas Typlöschung, die Typinformationen während der Kompilierung entfernt.

Im bereitgestellten Code zielt die Testermethode darauf ab, eine JSON-Anfrage in ein MyRequest-Objekt mit einem generischen Typ T zu analysieren. Allerdings ohne Angabe Jackson ist die eigentliche Klasse für T und behandelt sie standardmäßig als „T erweitert Objekt“ und bindet JSON-Objekte an Karten.

Um dieses Problem zu beheben, sollte die Testermethode beim Deserialisieren der JSON-Anfrage Zugriff auf die tatsächliche Klasse haben. Dies kann erreicht werden, indem es als Klassenargument angegeben wird. Der folgende Code zeigt, wie das geht:

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

Um sicherzustellen, dass die tatsächliche Klasse während der Deserialisierung verwendet wird, erstellen Sie außerdem einen JavaType mithilfe der TypeFactory wie folgt:

<code class="java">JavaType type = mapper.getTypeFactory().constructCollectionType(List.class, clazz);</code>

With Durch diese Änderung deserialisiert Jackson die JSON-Anfrage in eine Liste mit Instanzen der angegebenen Klasse, sodass die Methode getMyObject() das Objekt mit dem entsprechenden Typ zurückgeben kann.

Das obige ist der detaillierte Inhalt vonWie deserialisiere ich verschachtelte generische Objekte in Jackson mit Type Erasure?. 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