微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

即使我相信我已经注册了“平台类kotlin.Pair,也需要显式JsonAdapter进行注册”错误

如何解决即使我相信我已经注册了“平台类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 举报,一经查实,本站将立刻删除。