Je souhaite transférer un objet liste via Google Gson, mais je ne sais pas comment désérialiser des types génériques.
Ce que j'ai essayé après avoir regardé cela (réponse de BalusC):
MyClass mc = new Gson().fromJson(result, new List<MyClass>(){}.getClass());
mais alors j'obtiens une erreur dans l'éclipse disant "Le type nouveau List () {} doit implémenter la méthode abstraite héritée ..." et si j'utilise une solution rapide, j'obtiens un monstre de plus de 20 stubs de méthode.
Je suis presque sûr qu'il existe une solution plus simple, mais il me semble impossible de la trouver!
Éditer:
Maintenant j'ai
Type listType = new TypeToken<List<MyClass>>()
{
}.getType();
MyClass mc = new Gson().fromJson(result, listType);
Cependant, j'obtiens l'exception suivante sur la ligne "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)
Je fais JsonParseExceptions de capture et « résultat » est non nul.
J'ai vérifié listType avec le débogueur et j'ai obtenu ce qui suit:
- type de liste
- args = ListOfTypes
- list = null
- olvedTypes = Type [1]
- loader = PathClassLoader
- ownerType0 = null
- ownerTypeRes = null
- rawType = Classe (java.util.ArrayList)
- rawTypeName = "java.util.ArrayList"
- args = ListOfTypes
il semble donc que l'invocation "getClass" ne fonctionne pas correctement. Aucune suggestion...?
Edit2: I'v vérifié sur le Guide de l'utilisateur Gson . Il mentionne une exception d'exécution qui devrait se produire lors de l'analyse d'un type générique vers Json. Je l'ai fait "mal" (non illustré ci-dessus), comme dans l'exemple, mais je n'ai pas du tout obtenu cette exception. J'ai donc changé la sérialisation comme dans le guide d'utilisation suggéré. Mais ça n'a pas aidé.
Edit3: Résolu, voir ma réponse ci-dessous.
TokenType
. Avez-vous essayé de cette façon?