2016-03-30 9 views
2

Ich schrieb einen benutzerdefinierten Gson Typ Adapter für android.net.Uri:Gson Benutzerdefinierte Deserializer Handhabung Null

public class UriAdpter extends TypeAdapter<Uri> { 

    @Override 
    public void write(JsonWriter out, Uri value) throws IOException { 
     out.value(value.toString()); 
    } 

    @Override 
    public Uri read(JsonReader in) throws IOException { 
     return Uri.parse(in.nextString()); 
    } 
} 

Es ist großartig gearbeitet, bis auf der JSON-Feeds Ich habe mich Parsen einen null Wert für den URI. Dann warf er einen JsonSyntaxException:

03-30 08:40:00.799 16340-16340/com.example.app D/NewsFragment: Failed to retrieve articles 
     com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was NULL at line 1 column 23588 path $.data[5].thumbnail 
      at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220) 
      at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40) 
      at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82) 
      at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61) 
      at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:116) 
      at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:216) 
      at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:37) 
      at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:25) 
      at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:116) 
      at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:211) 
      at retrofit2.OkHttpCall.execute(OkHttpCall.java:174) 
      at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:144) 
      at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:125) 
      at rx.Observable$2.call(Observable.java:162) 
      at rx.Observable$2.call(Observable.java:154) 
      at rx.Observable$2.call(Observable.java:162) 
      at rx.Observable$2.call(Observable.java:154) 
      at rx.Observable.unsafeSubscribe(Observable.java:8314) 
      at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94) 
      at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55) 
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423) 
      at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
      at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269) 
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
      at java.lang.Thread.run(Thread.java:818) 
     Caused by: java.lang.IllegalStateException: Expected a string but was NULL at line 1 column 23588 path $.data[5].thumbnail 
      at com.google.gson.stream.JsonReader.nextString(JsonReader.java:830) 
      at com.example.app.data.rest.adapter.UriAdapter.read(UriAdapter.java:26) 
      at com.example.app.data.rest.adapter.UriAdapter.read(UriAdapter.java:16) 
      at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:116) 
      at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:216) 
      at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)  
      at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)  
      at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)  
      at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:116)  
      at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:216)  
      at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:37)  
      at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:25)  
      at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:116)  
      at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:211)  
      at retrofit2.OkHttpCall.execute(OkHttpCall.java:174)  
      at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:144)  
      at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:125)  
      at rx.Observable$2.call(Observable.java:162)  
      at rx.Observable$2.call(Observable.java:154)  
      at rx.Observable$2.call(Observable.java:162)  
      at rx.Observable$2.call(Observable.java:154)  
      at rx.Observable.unsafeSubscribe(Observable.java:8314)  
      at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94)  
      at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)  
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)  
      at java.util.concurrent.FutureTask.run(FutureTask.java:237)  
      at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)  
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)  
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)  
      at java.lang.Thread.run(Thread.java:818)  

Ich habe versucht, zu überprüfen, ob in.nextString()null war vor Parsen, aber das hat nicht funktioniert, weil in.nextString() die Ausnahme auslöst, nicht Uri.parse(). Wie überprüfe ich bei der Deserialisierung mit GSON nach null Objekten?

Antwort

4

Haben Sie versucht, JsonToken zu verwenden?

+0

Hm, jetzt bekomme ich eine andere 'JsonSyntaxException'; 'Erwartete einen Namen, war aber null in Zeile 1 Spalte 23588 Pfad $ .data [5] .thumbnail'. – Bryan

+1

Ah, nein, verpasste die 'in.nextNull()'. Fest, danke! – Bryan