带注释模型的 Moshi 适配器
Moshi adapter for annotated model
我目前正在使用 Moshi 适配器将一些 json raw 转换为给定类型。在我使用带注释的模型之前,它工作正常。
我想我应该在 Player::class.java
旁边向我的适配器添加另一个参数,但我不知道是什么。
举个例子:
data class Player(
val username: String,
@Json(name = "lucky number")
val luckyNumber: Int
)
private val playerStubRaw = "{\n" +
" \"username\": \"jesse\",\n" +
" \"lucky number\": 32\n" +
"}"
@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 工件,您还需要在 class 上添加 @JsonClass(generateAdapter = true) 才能正常解码,而不是将 属性 设置为默认值共 0
因此,在将 kotlin-kapt 插件和依赖项 kapt "com.squareup.moshi:moshi-kotlin-codegen:1.8.0"
添加到应用程序构建后 gradle 注释 class 如下:
@JsonClass(generateAdapter = true)
data class Player(
val username: String,
@Json(name = "lucky number")
val luckyNumber: Int
)
我目前正在使用 Moshi 适配器将一些 json raw 转换为给定类型。在我使用带注释的模型之前,它工作正常。
我想我应该在 Player::class.java
旁边向我的适配器添加另一个参数,但我不知道是什么。
举个例子:
data class Player(
val username: String,
@Json(name = "lucky number")
val luckyNumber: Int
)
private val playerStubRaw = "{\n" +
" \"username\": \"jesse\",\n" +
" \"lucky number\": 32\n" +
"}"
@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 工件,您还需要在 class 上添加 @JsonClass(generateAdapter = true) 才能正常解码,而不是将 属性 设置为默认值共 0
因此,在将 kotlin-kapt 插件和依赖项 kapt "com.squareup.moshi:moshi-kotlin-codegen:1.8.0"
添加到应用程序构建后 gradle 注释 class 如下:
@JsonClass(generateAdapter = true)
data class Player(
val username: String,
@Json(name = "lucky number")
val luckyNumber: Int
)