如何解决即使我相信我已经注册了“平台类kotlin.Pair,也需要显式JsonAdapter进行注册”错误
我在这里可能错得很厉害,这是我第一次将自定义适配器与moshi一起使用。
基本上,它的作用是我没有为Pair注册适配器,但我(至少据我所知)注册了。
这是我的适配器类:
internal class PairAdapter(
private val firstAdapter: JsonAdapter<Any>,private val secondAdapter: JsonAdapter<Any>,private val listadapter: JsonAdapter<List<String>>
): JsonAdapter<Pair<Any,Any>>() {
override fun toJson(writer: JsonWriter,value: Pair<Any,Any>?) {
value ?: throw NullPointerException("value == null")
writer.beginArray()
firstAdapter.toJson(writer,value.first)
secondAdapter.toJson(writer,value.second)
writer.endarray()
}
override fun fromJson(reader: JsonReader): Pair<Any,Any>? {
val list = listadapter.fromJson(reader) ?: return null
require(list.size == 2) { "Pair with more or less than two elements: $list" }
val first = firstAdapter.fromJsonValue(list[0])
?: throw IllegalStateException("Pair without first")
val second = secondAdapter.fromJsonValue(list[1])
?: throw IllegalStateException("Pair without second")
return first to second
}
}
class PairAdapterFactory: JsonAdapter.Factory {
override fun create(
type: Type,annotations: MutableSet<out Annotation>,moshi: moshi,): JsonAdapter<*>? {
if (type !is ParameterizedType || Pair::class.java != type.rawType) return null
val listType = Types.newParameterizedType(List::class.java,String::class.java)
val listadapter = moshi.adapter<List<String>>(listType)
return PairAdapter(
moshi.adapter(type.actualTypeArguments[0]),moshi.adapter(type.actualTypeArguments[1]),listadapter
)
}
}
这是我称之为的转换器之一:
@TypeConverter
fun fromOffspringListToJson(offspringList: List<Pair<Set<Trait>,Int>>): String {
val moshi = moshi.Builder()
.add(PairAdapterFactory())
.add(KotlinjsonAdapterFactory())
.build()
val offspringListWithStringFirsts = offspringList.map {
Pair(
fromTraitSetToJson(it.first),it.second
)
}
val mapType = Types.newParameterizedType(
List::class.java,Pair::class.java,String::class.javaObjectType,Int::class.javaObjectType
)
val jsonAdapter: JsonAdapter<List<Pair<String,Int>>> = moshi.adapter(mapType)
return jsonAdapter.toJson(offspringListWithStringFirsts)
}
我想念什么? 预先谢谢你。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。