Moshi适配器用于注释模型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Moshi适配器用于注释模型相关的知识,希望对你有一定的参考价值。

我目前正在使用Moshi适配器将一些json raw转换为给定类型。它工作正常,直到我使用注释模型。

我猜我应该在Player::class.java旁边的适配器上添加另一个参数,但我不知道是什么。

这是一个例子:

data class Player(
    val username: String,
    @Json(name = "lucky number")
    val luckyNumber: Int
)

private val playerStubRaw = "{
" +
    "  "username": "jesse",
" +
    "  "lucky number": 32
" +
    "}"

@Test
fun doSomething() {
    val moshi = Moshi.Builder().build()
    val player = moshi.adapter(Player::class.java).fromJson(playerStubRaw)
    // player.luckyNumber == 0
}

luckyNumber值为0而不是32。

知道我该怎么做才能让它发挥作用吗?

提前致谢,

答案

为了与Kotlin合作,Moshi需要反射的KotlinJsonAdapterFactory(来自moshi-kotlin神器)或代码生成适配器(来自moshi-kotlin-codegen神器)。 https://github.com/square/moshi#kotlin 在将来的Moshi版本中,将提出适当的错误来说明这一要求。

另一答案

使用moshi-kotlin-codegen工件,您还需要在类上添加@JsonClass(generateAdapter = true)以使解码正常工作,而不将该属性设置为默认值0

所以在将kotlin-kapt插件和依赖关系kapt "com.squareup.moshi:moshi-kotlin-codegen:1.8.0"添加到app build gradle之后,如下所示注释该类:

@JsonClass(generateAdapter = true)
data class Player(
    val username: String,
    @Json(name = "lucky number")
    val luckyNumber: Int
)

以上是关于Moshi适配器用于注释模型的主要内容,如果未能解决你的问题,请参考以下文章

Moshi 通用类型适配器

SerializedName 注释似乎在 Moshi 中不起作用

Moshi 的 Kotlin 代码生成器有啥用?

如何在 moshi (kotlin) 中解析 LinkedHashMap

php 一个自定义的try..catch包装器代码片段,用于执行模型函数,使其成为一个单行函数调用

如何在kotlin的片段内显示网格视图?