2014-12-10 12 views
5

Ho uno strano comportamento durante l'analisi di un json con gson. Io uso questo codice:JsonSyntaxException a causa di IllegalState di gson

private static Container parseContainer(String containerJson) { 

    try { 
     //TODO Remove try catch when Bug is done 
     return containerJson != null ? new Gson().fromJson(containerJson, Container.class) 
       : null; 

    } catch (JsonSyntaxException e) { 
     LOGGER.error("JsonSyntaxException ", e); 
     LOGGER.error("Json: " + containerJson); 

     //Sleep 3 minutes and try again. 
     try { 
      Thread.sleep(1000L * 60 * 3); 
     } catch (InterruptedException e1) { 
      LOGGER.error("Exception", e); 
     } 

     LOGGER.error("Try again to parse json: " + containerJson); 

     Container result = new Gson().fromJson(containerJson, Container.class); 

     LOGGER.error("Parsing successful on second try."); 

     return result; 
    } 

} 

Quando il metodo viene richiamato nel mio progetto, di solito funziona senza generare un'eccezione. Ma a volte viene lanciata l'eccezione e dopo aver atteso qualche tempo, l'analisi funziona correttamente.

Non ho capito quando viene lanciata l'eccezione e quando no.

Come può essere registrato il log "Analisi riuscita al secondo tentativo"?

L'eccezione è

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException 
at  com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapt erFactory.java:176) 
at com.google.gson.Gson.fromJson(Gson.java:803) 
at com.google.gson.Gson.fromJson(Gson.java:768) 
at com.google.gson.Gson.fromJson(Gson.java:717) 
at com.google.gson.Gson.fromJson(Gson.java:689) 
+0

Sembra che l'eccezione sia stata lanciata sulla chiamata daJson appena prima della stampa del registro di "Esegui con successo il secondo tentativo". Puoi mostrare qui un JSON in errore? –

+0

Registrare il JSON nel logcat prima di provare ad analizzarlo e rintracciare i dati esatti che si stanno tentando di analizzare prima dell'eccezione, in questo modo è possibile eseguire il debug se i dati sono corretti. Probabilmente c'è un bug nel back-end che stai usando. –

+0

hai verificato il tuo json? puoi provare a usare questo [collegamento] (http://jsonformat.com/) per verificare il tuo json –

risposta

0

tuo eccezione non è pieno. IllegalStateException deve avere qualche commento qui. Qualcosa come questo.

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: 
Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 

Sarebbe più utile se si può vedere in tale formato Quindi, in ogni caso l'errore che il vostro Container.class() non è il tipo corretto per il containerJson, cercare di risolvere il problema con il codice come questo

Type collectionType = new TypeToken<Collection<Container>>(){}.getType(); 
Collection<Container> enums = gson.fromJson(containerJson, collectionType); 
Problemi correlati