2015-09-07 7 views
8

Sapevo che questa domanda è stata posta prima. Grazie alla mia abilità di novizio in java e android. Non riesco a risolvere questo problema per più di una settimana.google gson Cast di classe LinkedTreeMap su myclass

Uno dei miei amici e io lo sviluppo di un progetto Android erano ci sono un paio di cose come questa.

La parte più strana di questo è, sta accadendo solo da quando lo scarica e lo provo da Google Play Store. Non dall'installazione locale di Android Studio o dalla modalità di debug.

Quale potrebbe essere il problema qui, o questo elenco di ritorno che è totalmente sbagliato? Il mio amico convince che questo codice ritorna correttamente ma dall'installazione di Play Store è sempre un errore.

Per favore suggerirmi dove dovrei continuare a scavare?

@Override 
public void promiseMethod(JSONObject object) { 
    if (object != null) { 

     if (object.has(DO_SERVICES)) { 
      vehicleDetails = new ArrayList <Object[]> (1); 
      List <String> vehicleNoList = new ArrayList <String> (1); 
      List <String> serviceList = new ArrayList <String> (1); 
      try { 
       Gson gson = new Gson(); 
       JSONObject jsonObj = new JSONObject(object.get(DO_SERVICES) 
        .toString()); 
       servDto = gson.fromJson(jsonObj.toString(), 
        ServiceDto.class); 


       if (servDto.getServiceDto() instanceof List) { 

        List <DoServiceDto> doServiceList = servDto.getServiceDto(); 

eccezione è

java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap non può essere lanciato a com.gaurage.dto.DoServiceDto a com.gaurage.user.User_Test_Main .promiseMethod (Fonte sconosciuta)

+0

Si prega di suggerire a chiunque ho bisogno di inviare più codice –

+0

strano problema per più di una settimana ed è stato giù votato ... Ho detto che i suoi lavori in installazione locale non dall'installazione play store –

+0

Si prega di comprendere la domanda e il codice prima giù voto. Guarda la mia risposta aggiornata. –

risposta

34

serializzazione e la deserializzazione generici Tipi

Quando si chiama toJSON (obj), GSON CAL ls obj.getClass() per ottenere informazioni sui campi da serializzare. Analogamente, è possibile passare in genere l'oggetto MyClass.class nel metodo fromJson (json, MyClass.class). Funziona bene se l'oggetto è di tipo non generico. Tuttavia, se l'oggetto è di tipo generico, le informazioni sul tipo generico vengono perse a causa della cancellazione del tipo Java. Ecco un esempio che illustra il punto:

class Foo<T> { T value;} 
Gson gson = new Gson(); 
Foo<Bar> foo = new Foo<Bar>(); 
gson.toJson(foo); // May not serialize foo.value correctly 
gson.fromJson(json, foo.getClass()); // Fails to deserialize foo.value as Bar 

Il codice di cui sopra non riesce a interpretare il valore come tipo bar perché GSON richiama list.getClass() per ottenere le informazioni di classe, ma questo metodo restituisce una classe prima, Foo.class . Ciò significa che Gson non ha modo di sapere che questo è un oggetto di tipo Foo, e non solo Plain Foo.

È possibile risolvere questo problema specificando il tipo parametrico corretto per il tipo generico. Puoi farlo usando la classe TypeToken.

Type fooType = new TypeToken<Foo<Bar>>() {}.getType();  
gson.toJson(foo, fooType); 
gson.fromJson(json, fooType); 

Ho classe Parent ed è classe figlio alcuni di loro hanno tipi di lista in esso. Come questa classe genitore ho 30 file. L'ho risolto così.

Gson gson = new Gson(); 
JSONObject jsonObj = new JSONObject(object.get(DO_SERVICES).toString()); 
Type type = new TypeToken<MyDto>() {}.getType(); 
servDto = gson.fromJson(jsonObj.toString(),type); 

La cosa più importante è, non riesco a riprodurre questo errore in fase di test locale da studio di Android. Questo problema si verifica solo quando ho generato l'app firmato e ho pubblicato l'app in PlayStore quando l'app si è interrotta e il rapporto dice che non è possibile eseguire il cast di LinkedTreeMap su myclass.

È stato difficile per me riprodurre lo stesso risultato nei test locali (include la modalità Debug).

+1

che ha funzionato per me, grazie :) –

+2

riproduce quando si utilizza proguard (minifyEnabled true) – Pnemonic

+1

@ Log.d Grazie, ha funzionato per me. Ci sono volute 6 ore prima che mi rendessi conto del problema e ho trovato il tuo post. –