Ich möchte ein Listenobjekt über Google Gson übertragen, aber ich weiß nicht, wie man generische Typen deserialisiert.
Was ich versucht habe, nachdem ich mir este (die Antwort von BalusC):
MyClass mc = new Gson().fromJson(result, new List<MyClass>() {}.getClass());
aber dann bekomme ich in Eclipse die Fehlermeldung "The type new List<MyClass>() {}
muss die geerbte abstrakte Methode implementieren..." und wenn ich eine schnelle Lösung verwende, erhalte ich ein Monster von über 20 Methoden-Stubs.
Ich bin mir ziemlich sicher, dass es eine einfachere Lösung gibt, aber ich scheine sie nicht zu finden!
Jetzt habe ich das hier:
Type listType = new TypeToken<List<MyClass>>() {}.getType();
MyClass mc = new Gson().fromJson(result, listType);
Ich erhalte jedoch die folgende Ausnahme bei der fromJson
Linie:
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)
I hacer fangen JsonParseExceptions
y result
ist nicht null.
Ich überprüfte listType
mit dem Debugger und erhielt folgendes Ergebnis:
list Type
args = ListOfTypes
list = null
resolvedTypes = Type[ 1 ]
loader = PathClassLoader
ownerType0 = null
ownerTypeRes = null
rawType = Class (java.util.ArrayList)
rawTypeName = "java.util.ArrayList"
Es scheint also, dass die getClass
Aufrufen nicht richtig funktioniert hat. Irgendwelche Vorschläge...?
Ich habe die Gson Benutzerhandbuch . Es erwähnt eine Laufzeit-Ausnahme, die während des Parsens eines generischen Typs zu Json passieren sollte. Ich tat es "falsch" (nicht oben gezeigt), genau wie im Beispiel, aber nicht erhalten, dass Ausnahme überhaupt. Also änderte ich die Serialisierung wie im Benutzerhandbuch vorgeschlagen. Das hat aber nicht geholfen.
Editar:
Gelöst, siehe meine Antwort unten.