【问题标题】:How to convert list of int in json to list/array of enums using Moshi?如何使用 Moshi 将 json 中的 int 列表转换为枚举列表/数组?
【发布时间】:2020-08-13 07:59:19
【问题描述】:

我从 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>
)

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

【问题讨论】:

    标签: json parsing kotlin enums moshi


    【解决方案1】:

    如果您使用 Moshi 的 codegen(您应该这样做),您只需为您的 MyEnum 本身编写适配器。

    class MyEnumAdapter {
        @ToJson
        fun toJson(enum: MyEnum): Int {
            return enum.type
        }
    
        @FromJson
        fun fromJson(type: Int): MyEnum {
            return MyEnum.from(it)
        }
    }
    

    按照您在问题中的方式将适配器连接到您的 Moshi 构建器。然后,更新您的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&lt;MyEnum&gt; 的适配器(您尝试自己创建的那个),因此您不必创建这些适配器你自己。 @Json(name="...") 只是一个约定,可以省略。

    要集成codegen,只需添加依赖即可:

    kapt("com.squareup.moshi:moshi-kotlin-codegen:1.9.3")
    

    更多详情请见https://github.com/square/moshi

    【讨论】:

    • Hmm.. 我仍然收到同样的错误:无法为 java.util.List<...myenum> 创建转换器
    • 我是否需要以某种方式将生成的适配器添加到我的 moshi 中,否则会立即发生这种情况吗?
    • 应该开箱即用。尝试 - 在构建之后 - 在您的项目中搜索 InfoObjectAdapter 类,如果您正确设置了所有依赖项,它应该是自动生成的文件之一。如果你觉得卡住了,那么,如果可能的话,把你的代码上传到 github,然后我可以检查它。
    • 还要检查这个特定的部分,应该是你的用例:github.com/square/moshi#built-in-type-adapters
    • 那么您可能在改造实例中设置了错误的东西。 github.com/phamtdat/MoshiDemo我做了一个工作演示来反映你的情况,看看看看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2011-08-02
    • 2013-06-11
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多