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

Kotlin 为什么Moshi不使用我的自定义适配器?,kotlin,moshi,Kotlin,Moshi,我们有一个多态行为,为了满足反序列化的需要,我们为它编写了一个定制的Moshi适配器 @JsonClass(generateAdapter = true) open class Field 以上是我们正在做的一个非常简化的版本。我们希望为子类(Field1和Field2)使用Moshi生成的适配器,并且此自定义适配器仅基于可用字段委托fromJson。以下是字段的自定义适配器: class FieldAdapter { var moshi = Moshi.Builder().build

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

@JsonClass(generateAdapter = true)
open class Field
以上是我们正在做的一个非常简化的版本。我们希望为子类(
Field1
Field2
)使用Moshi生成的适配器,并且此自定义适配器仅基于可用字段委托fromJson。以下是
字段的自定义适配器:

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")
    }
}
上面的测试没有调用自定义适配器的fromJson,但是如果我们将
val adapter=moshi.adapter(Field::class.java)
更改为
val adapter=FieldAdapter()
(对自定义适配器进行硬编码),它就可以工作

你能告诉我我们做错了什么吗

任何帮助都将不胜感激


TIA

对于任何面临相同问题的人,只需在自定义JSON适配器中实现
JsonAdapter
(toJson和fromJson方法),它就会正常工作


不幸的是,我仍然无法回答为什么原始问题中的适配器无法工作,因为他们的官方文档中就是这样做的。

我觉得很好,你能发布field1.json和测试返回的错误吗?@NicolaGallazzi是的,我尝试了很多方法,但都没有成功。在放弃之前,我试着实现了
JsonAdapter
,但效果很好。
@JsonClass(generateAdapter = true)
data class Field2 (
    @Json(name = "address")
    val address: String
): 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)
}