kotlin - 为什么 Moshi 不使用我的自定义适配器?

标签 kotlin moshi

我们有一个多态行为,为了满足它的反序列化,我们为它编写了一个自定义的 Moshi 适配器。

@JsonClass(generateAdapter = true)
open class Field
@JsonClass(generateAdapter = true)
data class Field1 (
    @Json(name = "name")
    val name: String
): Field()
@JsonClass(generateAdapter = true)
data class Field2 (
    @Json(name = "address")
    val address: String
): Field()
以上是我们正在做的事情的一个非常简化的版本。我们想为子类( Field1Field2 )使用 Moshi 生成的适配器,并且这个自定义适配器仅根据可用字段委托(delegate) fromJson。这是 Field 的自定义适配器:
class FieldAdapter {
    var moshi = Moshi.Builder().build()
    @ToJson
    fun toJson(field: Field): String {
        return ""
    }

    @FromJson
    fun fromJson(json: String): Field {
        val jsonObject = gson.fromJson(json, JsonObject::class.java)
        var field: Field? = null

        if (jsonObject.has("name")) {
            val field1JsonAdapter: JsonAdapter<Field1> = moshi.adapter(Field1::class.java)
            field = field1JsonAdapter.fromJson(json)
        } else if (jsonObject.has("address")) {
            val field2JsonAdapter: JsonAdapter<Field2> = moshi.adapter(Field2::class.java)
            field = field2JsonAdapter.fromJson(json)
        }

        field?.let {
            return it
        }

        throw JsonDataException("Not a valid field JSON")
    }
}
以下测试不起作用:
@Test
fun testField1Serialization() {
    val json = MockResponseFileReader("field1.json").content

    val moshi = Moshi.Builder().add(FieldAdapter()).build()
    val adapter = moshi.adapter(Field::class.java)

    val field = adapter.fromJson(json)

    val field1 = field as Field1
    assertEquals("abc", field1.name)
}
上面的测试没有调用我们自定义适配器的 fromJson,但是如果我们更改 val adapter = moshi.adapter(Field::class.java)val adapter = FieldAdapter() (硬编码自定义适配器),它可以工作。
你能指导我们做错什么吗?
任何帮助,将不胜感激。
TIA

最佳答案

对于面临同样问题的任何人,只需实现 JsonAdapter (toJson 和 fromJson 方法)在您的自定义 JSON 适配器中,它就会起作用。
不幸的是,我仍然没有答案为什么原始问题中的适配器不起作用,因为这是在他们的官方文档中完成的。

关于kotlin - 为什么 Moshi 不使用我的自定义适配器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64004216/

相关文章:

kotlin - Moshi @Json 注释不适用于 com.github.kittinunf.fuel.moshi.moshiDeserializerOf?

java - 在 Kotlin 注释参数中使用 java 常量

gradle - Kotlin 无法将 gradle 的 Action 类转换为 lambda

json - Moshi 的 Kotlin 代码生成器有什么用?

json - 使用Moshi解析JSON中的包装对象

android - Moshi如何将kotlin的默认值应用到json的null字段

kotlin - 如何在带有ktor框架的graphql-kotlin中进行字段级解析器

java - 在 Kotlin 中改造单例

gradle - 无法运行jar文件。 (错误:找不到或加载主类co.pissarra.Mainkt)

generics - 用于通用列表的 Moshi 自定义适配器 <T :Enum> returns List<List<T:Enum>> instead of List<T:Enum>