Quero transferir um objeto de lista pelo Google Gson, mas não sei desserializar tipos genéricos.
O que eu tentei depois de olhar para isso (resposta de BalusC):
MyClass mc = new Gson().fromJson(result, new List<MyClass>(){}.getClass());
mas, em seguida, recebo um erro no eclipse dizendo "O tipo new List () {} deve implementar o método abstrato herdado ..." e, se eu usar uma correção rápida, recebo um monstro com mais de 20 stubs de métodos.
Tenho certeza de que existe uma solução mais fácil, mas não consigo encontrá-la!
Editar:
Agora eu tenho
Type listType = new TypeToken<List<MyClass>>()
{
}.getType();
MyClass mc = new Gson().fromJson(result, listType);
No entanto, recebo a seguinte exceção na linha "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)
I fazer JsonParseExceptions de captura e "resultado" não é nulo.
Eu verifiquei listType com o depurador e obtive o seguinte:
- Tipo de lista
- args = ListOfTypes
- list = null
- resolvedTypes = Tipo [1]
- loader = PathClassLoader
- ownerType0 = null
- ownerTypeRes = null
- rawType = Class (java.util.ArrayList)
- rawTypeName = "java.util.ArrayList"
- args = ListOfTypes
parece que a chamada "getClass" não funcionou corretamente. Alguma sugestão...?
Edit2: verifiquei no Guia do Usuário do Gson . Ele menciona uma exceção de tempo de execução que deve ocorrer durante a análise de um tipo genérico para o Json. Fiz isso "errado" (não mostrado acima), como no exemplo, mas não recebi a exceção. Então mudei a serialização como no guia do usuário sugerido. Não ajudou, no entanto.
Edit3: Resolvido, veja minha resposta abaixo.
TokenType
. Você já tentou dessa maneira?