如何注册自定义的Json解串器在GSON?
当我注册Java代码解串器都工作正常,但是当我转换科特林到Java - 解串器方法不会被调用。
科特林注册代码:
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)的问题,还是什么,我做错了什么?
问题是,科特林编译器看到的List
像一个协变的泛型类型List<out T>
和编译及其实例作为通配符类型,即List<CharSequence>
被编译成List<? extends Charsequence>
。
的解决方法是,使用MutableList
其是invatiant
object : TypeToken<MutableList<Advert>>() {}.type
或supperss通配符代
object : TypeToken<List<@JvmSuppressWildcards Advert>>() {}.type
更多信息:科特林泛型。方差
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句