Voglio trasferire un oggetto elenco tramite Google Gson, ma non so come deserializzare i tipi generici.
Cosa ho provato dopo aver visto questo (la risposta di BalusC):
MyClass mc = new Gson().fromJson(result, new List<MyClass>(){}.getClass());
ma poi ricevo un errore in eclipse che dice "Il tipo new List () {} deve implementare il metodo astratto ereditato ..." e se uso una soluzione rapida ottengo un mostro di oltre 20 matrici di metodi.
Sono abbastanza sicuro che esiste una soluzione più semplice, ma non riesco a trovarla!
Modificare:
Adesso ho
Type listType = new TypeToken<List<MyClass>>()
{
}.getType();
MyClass mc = new Gson().fromJson(result, listType);
Tuttavia, ottengo la seguente eccezione nella riga "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)
Io faccio JsonParseExceptions cattura e "risultato" non è nullo.
Ho controllato listType con il debugger e ho ottenuto quanto segue:
- tipo di elenco
- args = ListOfTypes
- list = null
- resolvedTypes = Tipo [1]
- loader = PathClassLoader
- ownerType0 = null
- ownerTypeRes = null
- rawType = Class (java.util.ArrayList)
- rawTypeName = "java.util.ArrayList"
- args = ListOfTypes
quindi sembra che l'invocazione "getClass" non abbia funzionato correttamente. Eventuali suggerimenti...?
Edit2: ho controllato nella Guida dell'utente di Gson . Indica un'eccezione di runtime che dovrebbe verificarsi durante l'analisi di un tipo generico su Json. L'ho fatto "sbagliato" (non mostrato sopra), proprio come nell'esempio, ma non ho ottenuto alcuna eccezione. Quindi ho modificato la serializzazione come suggerito nella guida per l'utente. Non ha aiutato, però.
Edit3: risolto, vedi la mia risposta di seguito.
TokenType
. Hai provato in quel modo?