Ich möchte die Jackson JSON-Bibliothek für eine generische Methode wie folgt verwenden:
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{
private List<T> myobjects;
public void setMyObjects(List<T> ets) {
this.myobjects = ets;
}
@NotNull
@JsonIgnore
public T getMyObject() {
return myobjects.get(0);
}
}
Das Problem ist nun, dass wenn ich getMyObject () aufrufe, das sich innerhalb des Anforderungsobjekts befindet, Jackson das verschachtelte benutzerdefinierte Objekt als LinkedHashMap zurückgibt. Gibt es eine Möglichkeit, wie ich spezifiziere, dass das T-Objekt zurückgegeben werden muss? Beispiel: Wenn ich ein Objekt vom Typ Kunde gesendet habe, sollte der Kunde von dieser Liste zurückgegeben werden.
Vielen Dank.
TypeReference
abstrakt?Antworten:
Dies ist ein bekanntes Problem beim Löschen von Java-Typen: T ist nur eine Typvariable, und Sie müssen die tatsächliche Klasse angeben, normalerweise als Klassenargument. Ohne solche Informationen ist es am besten, Grenzen zu verwenden. und einfaches T ist ungefähr dasselbe wie 'T erweitert Objekt'. Und Jackson wird dann JSON-Objekte als Karten binden.
In diesem Fall muss die Testermethode Zugriff auf Class haben, und Sie können konstruieren
und dann
quelle
'JavaType' funktioniert !! Ich habe versucht, eine Liste in json String in ArrayList-Java-Objekte zu entfernen (deserialisieren) und hatte seit Tagen Probleme, eine Lösung zu finden.
Unten ist der Code, der mir endlich eine Lösung gegeben hat. Code:
quelle
IOException
(nur einen Fang benötigen) und dass der Standard-Introspektor für Anmerkungen bereits vorhanden ist. SieJacksonAnnotationIntrospector
müssen also nichts tunObjectMapper
, konstruieren ihn einfach und es funktioniert.Ich habe die Antwort von Rushidesai1 geändert , um ein funktionierendes Beispiel aufzunehmen.
JsonMarshaller.java
Ausgabe
JsonMarshallerUnmarshaller.java
Station.java
data.json
quelle