2017-07-26 6 views
3

Comment enregistrer personnalisé désérialiseur Json dans Gson?Désérialiseur personnalisé Kotlin Gson pour la liste

Quand je suis déserializer de registre dans le code java tout fonctionne très bien, mais quand je convertis Kotlin en Java - désérialiser la méthode non appelée.

Kotlin Code registre:

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

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

code Java:

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

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

déclaration désérialiseur:

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

Méthode appelant

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

Si je comprends bien - problème dans le type d'objet JSON (listType), ou ce que je fais mal?

Répondre

5

Le problème est que le compilateur Kotlin ajoute un caractère générique pour List, i. e. List<CharSequense> se compile en tant que List<? extends Charsequence>.

La solution est soit d'utiliser MutableList

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

ou supperss wildcard

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

Merci, il est à résoudre mon problème! –