为什么 Moshi 不使用我的自定义适配器?
Why does Moshi not use my custom adapter?
我们有一个多态行为,为了满足它的反序列化,我们为它编写了一个自定义的 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()
以上是我们正在做的事情的一个非常简化的版本。我们想为子 类(Field1
和 Field2
)使用 Moshi 生成的适配器,并且此自定义适配器仅根据可用字段委托 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
对于面临相同问题的任何人,只需在您的自定义 JSON 适配器中实施 JsonAdapter
(toJson 和 fromJson 方法),它就会正常工作。
不幸的是,我仍然无法回答为什么原始问题中的适配器无法工作,因为这是他们官方文档中的做法。
我们有一个多态行为,为了满足它的反序列化,我们为它编写了一个自定义的 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()
以上是我们正在做的事情的一个非常简化的版本。我们想为子 类(Field1
和 Field2
)使用 Moshi 生成的适配器,并且此自定义适配器仅根据可用字段委托 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
对于面临相同问题的任何人,只需在您的自定义 JSON 适配器中实施 JsonAdapter
(toJson 和 fromJson 方法),它就会正常工作。
不幸的是,我仍然无法回答为什么原始问题中的适配器无法工作,因为这是他们官方文档中的做法。