2017-07-26 6 views
3

Wie benutzerdefinierte Json Deserializer in Gson registrieren?Kotlin Gson benutzerdefinierte Deserializer für die Liste

Wenn ich Register Deserializer in Java-Code bin, funktioniert alles gut, aber wenn ich Kotlin in Java konvertieren - Deserializer-Methode nicht aufgerufen.

Kotlin Registercode:

val listType: Type = object : TypeToken<List<Advert>>() {}.type 
val gson = GsonBuilder() 
      .registerTypeAdapter(listType, deserializer) 

val retrofit = Retrofit.Builder() 
       .addConverterFactory(GsonConverterFactory.create(gson)) 

Java-Code:

Type listType = new TypeToken<List<Advert>>() {}.getType(); 
Gson gson = new GsonBuilder() 
      .registerTypeAdapter(listType, deserializer) 

Retrofit retrofit = new Retrofit.Builder() 
      .addConverterFactory(GsonConverterFactory.create(gson)) 

Deserializer Erklärung:

class AdvertsDeserializer : JsonDeserializer<List<Advert>> { 
override fun deserialize(json: JsonElement?, typeOfT: Type?, 
         context: JsonDeserializationContext?): List<Advert> { 

Methode

// list is List<Advert> 
service.getAdverts() 
      .subscribe({ 
       list -> 
       viewState.showAdvertsList(list) 
      }, { 
       error -> 
       error.printStackTrace() 
      }) 
0 Aufruf

Wie ich verstehe - Problem in Art von Json-Objekt (ListType), oder was mache ich falsch?

Antwort

5

Das Problem ist, dass Kotlin Compiler fügt einen Platzhalter für List, i. e. List<CharSequense> kompiliert als List<? extends Charsequence>.

Die Lösung entweder MutableList

object : TypeToken<MutableList<Advert>>() {}.type 

zu verwenden ist oder Wildcard

object : TypeToken<List<@JvmSuppressWildcards Advert>>() {}.type 
+0

Dank supperss, es ist mein Problem lösen! –

Verwandte Themen