如何在Gson中注册自定义Json反序列化器?
当我在java代码中注册反序列化时,一切正常,但是当我将Kotlin转换为Java时 - 没有调用deserializer方法。
Kotlin注册码:
val listType: Type = object : TypeToken<List<Advert>>() {}.type
val gson = GsonBuilder()
.registerTypeAdapter(listType, deserializer)
val retrofit = Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create(gson))
Java代码:
Type listType = new TypeToken<List<Advert>>() {}.getType();
Gson gson = new GsonBuilder()
.registerTypeAdapter(listType, deserializer)
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create(gson))
反序列化器声明:
class AdvertsDeserializer : JsonDeserializer<List<Advert>> {
override fun deserialize(json: JsonElement?, typeOfT: Type?,
context: JsonDeserializationContext?): List<Advert> {
方法调用
// list is List<Advert>
service.getAdverts()
.subscribe({
list ->
viewState.showAdvertsList(list)
}, {
error ->
error.printStackTrace()
})
据我所知 - Json对象的类型问题(listType),或者我做错了什么?
答案 0 :(得分:11)
问题在于Kotlin编译器将List
视为协变泛型类型List<out T>
,并将其实例化编译为通配符类型,i。即List<CharSequence>
被编译为List<? extends Charsequence>
。
解决方案是要使用MutableList
是不可靠的
object : TypeToken<MutableList<Advert>>() {}.type
或supperss通配符生成
object : TypeToken<List<@JvmSuppressWildcards Advert>>() {}.type