如何使用Moshi将json中的int列表转换为枚举的列表/数组?

问题描述

我从API获得一个整数列表(实际上是枚举)。当我尝试解析它时,我得到:Unable to create converter for java.util.List<MyEnum>

我的适配器当前看起来像这样:

@Retention(AnnotationRetention.RUNTIME)
@JsonQualifier
annotation class MyEnumListAnnotation

class MyEnumListAdapter {
    @ToJson
    fun toJson(@MyEnumListAnnotation myEnumList: List<MyEnum>): List<Int> {
        return myEnumList.map { it.type }
    }

    @FromJson
    @MyEnumListAnnotation
    fun fromJson(typeList: List<Int>): List<MyEnum> {
        return typeList.map { MyEnum.from(it) }
    }
}

我将其添加到网络客户端,如下所示:

Moshi.Builder()
                    .add([A lot of other adapters])
                    .add(MyEnumListAdapter())

我正在使用这样的注释(在我要解析的对象中):

data class InfoObject(
        val id: String,val name: String,val email: String,val phone: String,@MyEnumListAnnotation
        val myEnums: List<MyEnum>
)

如何编写适配器以使其正常工作?感谢您的所有帮助。 :)

解决方法

如果使用Moshi的x = ["a","b","c","d","e"] y = [ 5,1,4,2,3] def sort_list(list1,list2): indexs = {k: v for (k,v) in zip(list2,list1)} list2 = sorted(list2) list1 = [indexs[i] for i in list2] return (list1,list2) sort_list(x,y) >>> (['b','d','e','c','a'],[1,3,5]) (应该使用),则只需要为codegen本身编写适配器。

MyEnum

按照您在问题中所做的方式将适配器连接到Moshi构建器。然后,更新您的class MyEnumAdapter { @ToJson fun toJson(enum: MyEnum): Int { return enum.type } @FromJson fun fromJson(type: Int): MyEnum { return MyEnum.from(it) } }

InfoObject

@JsonClass(generateAdapter = true) data class InfoObject( @Json(name = "id") val id: String,@Json(name = "name") val name: String,@Json(name = "email") val email: String,@Json(name = "phone") val phone: String,@Json(name = "myEnums") val myEnums: List<MyEnum> ) 将确保库将为您的@JsonClass(generateAdapter = true)自动创建一个适配器,包括InfoObject(您试图创建自己的适配器)的适配器,因此您不必不必自己创建这些适配器。 List<MyEnum>只是一个约定,您可以忽略它。

要集成@Json(name="..."),只需添加到依赖项:

codegen

有关更多详细信息,请参见https://github.com/square/moshi

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...