2013-06-27 5 views
6

sto ottenendo questo problema, non voglio per risolvere il problema, ma trovare per modo di dire a GSON "ignorare gli errori e continua" l'analisi:GSON evitare il JsonSyntaxException restituire la mappatura parziale

Can't parses json : java.lang.IllegalStateException: 
    Expected a string but was BEGIN_OBJECT at line 1 column 16412 

Codice utilizzato:

JsonReader reader = new JsonReader(new StringReader(data)); 
reader.setLenient(true); 
Articles articles = gson.create().fromJson(reader, Articles.class); 

I dati sono (per semplificare): Articoli-> Pagine-> medias.fields. Un campo nell'errore corrente è definito come stringa ma sto ricevendo un oggetto (ma ancora una volta si tratta di una sola occorrenza). Non posso aggiungere la protezione in tutto il mondo quindi la mia domanda è:? "c'è un salto e continua a GSON

voglio evitare JsonSysntaxException con GSON quando c'è un problema su un nodo e mi aspetto almeno di recuperare il parziale dati analizzati Nel mio caso avrei avuto il 99,999% dei dati e solo il mio campo sbagliato come nullo ... So che non sembra pulito, ma vorrei abilitare la "modalità rigorosa" per il test dell'unità o l'integrazione continua per rilevare il problema e produzione abiliterei una "modalità soft" in modo che la mia applicazione possa iniziare (anche quando il server fa errori) Non posso dire alla mia custom, la tua app non può iniziare perché un articolo ha dati invalidi

È GSON avere un " salta e continua con l'errore "?

+0

mostraci il codice ?? – ajduke

+0

puoi postare la risposta dal servizio web, aiuterà di più a risolvere il tuo problema – KOTIOS

+0

Ho aggiunto il codice e non voglio risolvere questo problema ma trovare un modo per non attivare questa eccezione quando solo una foglia/un nodo è influenzato da un cattivo formato. È possibile ? – Gros

risposta

2

Penso che la risposta sia semplicemente: no, generalmente non può.

A causa della natura di analisi parsing ricorsiva della libreria se qualcosa non va, si genererebbe qualche tipo di eccezione. Sarebbe interessante se potessi pubblicare un SSCCE del tuo problema per sperimentare se è possibile creare un adattatore di tipo personalizzato che gestisca le migliori eccezioni.

1

ecco la soluzione: Bisogna creare TypeAdapterFactory che vi permetterà di intercettare TypeAdapter predefinita, ma ancora di partire per accedere a difetto TypeAdapter come delegato. Quindi puoi semplicemente provare a leggere il valore utilizzando delegato da TypeAdapter predefinito ed elaborare i dati imprevisti come desideri.

 public Gson getGson() { 

       return new GsonBuilder() 
          .registerTypeAdapterFactory(new LenientTypeAdapterFactory()) 
       .create(); 
      } 


     class LenientTypeAdapterFactory implements TypeAdapterFactory { 

       public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { 

        final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type); 

        return new TypeAdapter<T>() { 

         public void write(JsonWriter out, T value) throws IOException { 
          delegate.write(out, value); 
         } 

         public T read(JsonReader in) throws IOException { 
          try { //Here is the magic 
//Try to read value using default TypeAdapter 
           return delegate.read(in); 
          } catch (JsonSyntaxException e) { 
//If we can't in case when we expecting to have an object but array is received (or some other unexpected stuff), we just skip this value in reader and return null 
           in.skipValue(); 
           return null; 
          } 
         } 
        }; 
       } 
    }