gpt4 book ai didi

java - 列表的 Kotlin Gson 自定义反序列化器

转载 作者:IT老高 更新时间:2023-10-28 13:46:41 37 4
gpt4 key购买 nike

如何在 Gson 中注册自定义的 Json 反序列化器?

当我在 Java 代码中注册反序列化器时一切正常,但是当我将 Kotlin 转换为 Java 时 - 没有调用反序列化器方法。

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)类型的问题,或者我做错了什么?

最佳答案

问题是 Kotlin 编译器看到 List像协变泛型类型 List<out T>并将其实例编译为通配符类型,即。 e. List<CharSequence>编译为 List<? extends Charsequence> .

解决方案是使用 MutableList这是invatiant

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

或支持通配符生成

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

更多信息:Kotlin Generics. Variance

关于java - 列表的 Kotlin Gson 自定义反序列化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45327893/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com