Ich möchte ein Listenobjekt über Google Gson übertragen, weiß jedoch nicht, wie generische Typen deserialisiert werden sollen.
Was ich versucht , nachdem bei der Suche diese (BalusC Antwort):
MyClass mc = new Gson().fromJson(result, new List<MyClass>(){}.getClass());
Aber dann erhalte ich in Eclipse die Fehlermeldung "Der Typ new List () {} muss die geerbte abstrakte Methode implementieren ..." und wenn ich eine schnelle Lösung verwende, erhalte ich ein Monster mit über 20 Methodenstubs.
Ich bin mir ziemlich sicher, dass es eine einfachere Lösung gibt, aber ich scheine sie nicht zu finden!
Bearbeiten:
Jetzt habe ich
Type listType = new TypeToken<List<MyClass>>()
{
}.getType();
MyClass mc = new Gson().fromJson(result, listType);
In der Zeile "fromJson" wird jedoch die folgende Ausnahme angezeigt:
java.lang.NullPointerException
at org.apache.harmony.luni.lang.reflect.ListOfTypes.length(ListOfTypes.java:47)
at org.apache.harmony.luni.lang.reflect.ImplForType.toString(ImplForType.java:83)
at java.lang.StringBuilder.append(StringBuilder.java:203)
at com.google.gson.JsonDeserializerExceptionWrapper.deserialize(JsonDeserializerExceptionWrapper.java:56)
at com.google.gson.JsonDeserializationVisitor.invokeCustomDeserializer(JsonDeserializationVisitor.java:88)
at com.google.gson.JsonDeserializationVisitor.visitUsingCustomHandler(JsonDeserializationVisitor.java:76)
at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:106)
at com.google.gson.JsonDeserializationContextDefault.fromJsonArray(JsonDeserializationContextDefault.java:64)
at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:49)
at com.google.gson.Gson.fromJson(Gson.java:568)
at com.google.gson.Gson.fromJson(Gson.java:515)
at com.google.gson.Gson.fromJson(Gson.java:484)
at com.google.gson.Gson.fromJson(Gson.java:434)
Ich tun fangen JsonParseExceptions und „Ergebnis“ ist nicht null.
Ich habe listType mit dem Debugger überprüft und Folgendes erhalten:
- Listentyp
- args = ListOfTypes
- list = null
- ResolutionTypes = Typ [1]
- loader = PathClassLoader
- ownerType0 = null
- ownerTypeRes = null
- rawType = Klasse (java.util.ArrayList)
- rawTypeName = "java.util.ArrayList"
- args = ListOfTypes
Es scheint also, dass der Aufruf von "getClass" nicht richtig funktioniert hat. Irgendwelche Vorschläge...?
Edit2: Ich habe im Gson-Benutzerhandbuch nachgesehen . Es wird eine Laufzeitausnahme erwähnt, die beim Parsen eines generischen Typs für Json auftreten sollte. Ich habe es "falsch" gemacht (oben nicht gezeigt), genau wie im Beispiel, aber diese Ausnahme überhaupt nicht bekommen. Also habe ich die Serialisierung wie im Benutzerhandbuch vorgeschlagen geändert. Hat aber nicht geholfen.
Edit3: Gelöst, siehe meine Antwort unten.
TokenType
. Hast du es so versucht?