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!