Quiero transferir un objeto de lista a través de Google Gson, pero no sé cómo deserializar los tipos genéricos.
Lo que probé después de mirar esto (la respuesta de BalusC):
MyClass mc = new Gson().fromJson(result, new List<MyClass>(){}.getClass());
pero luego aparece un error en eclipse que dice "El tipo new List () {} debe implementar el método abstracto heredado ..." y si uso una solución rápida obtengo un monstruo de más de 20 stubs de método.
Estoy bastante seguro de que hay una solución más fácil, ¡pero parece que no puedo encontrarla!
Editar:
Ahora tengo
Type listType = new TypeToken<List<MyClass>>()
{
}.getType();
MyClass mc = new Gson().fromJson(result, listType);
Sin embargo, obtengo la siguiente excepción en la línea "fromJson":
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)
Yo hago JsonParseExceptions de captura y "número" no es nulo.
Verifiqué listType con el depurador y obtuve lo siguiente:
- tipo de lista
- args = ListOfTypes
- lista = nulo
- resolveTypes = Tipo [1]
- cargador = PathClassLoader
- ownerType0 = nulo
- ownerTypeRes = nulo
- rawType = Class (java.util.ArrayList)
- rawTypeName = "java.util.ArrayList"
- args = ListOfTypes
entonces parece que la invocación "getClass" no funcionó correctamente. Alguna sugerencia...?
Edit2: he comprobado en la Guía del usuario de Gson . Menciona una excepción de tiempo de ejecución que debería ocurrir durante el análisis de un tipo genérico a Json. Lo hice "mal" (no se muestra arriba), como en el ejemplo, pero no obtuve esa excepción en absoluto. Así que cambié la serialización como se sugiere en la guía del usuario. Sin embargo, no ayudó.
Edit3: Resuelto, mira mi respuesta a continuación.
TokenType
. ¿Has intentado de esa manera?