gpt4 book ai didi

android - 用 Moshi 序列化密封类

转载 作者:行者123 更新时间:2023-11-29 23:11:55 25 4
gpt4 key购买 nike

以下将产生 IllegalArgumentException,因为您“无法序列化抽象类”

sealed class Animal {
data class Dog(val isGoodBoy: Boolean) : Animal()
data class Cat(val remainingLives: Int) : Animal()
}

private val moshi = Moshi.Builder()
.build()

@Test
fun test() {
val animal: Animal = Animal.Dog(true)
println(moshi.adapter(Animal::class.java).toJson(animal))
}

我曾尝试使用自定义适配器解决此问题,但我能想出的唯一解决方案涉及显式写入每个子类的所有属性名称。例如:

class AnimalAdapter {
@ToJson
fun toJson(jsonWriter: JsonWriter, animal: Animal) {
jsonWriter.beginObject()
jsonWriter.name("type")
when (animal) {
is Animal.Dog -> jsonWriter.value("dog")
is Animal.Cat -> jsonWriter.value("cat")
}

jsonWriter.name("properties").beginObject()
when (animal) {
is Animal.Dog -> jsonWriter.name("isGoodBoy").value(animal.isGoodBoy)
is Animal.Cat -> jsonWriter.name("remainingLives").value(animal.remainingLives)
}
jsonWriter.endObject().endObject()
}

....
}

最终我希望生成如下所示的 JSON:

{
"type" : "cat",
"properties" : {
"remainingLives" : 6
}
}
{
"type" : "dog",
"properties" : {
"isGoodBoy" : true
}
}

我很高兴必须使用自定义适配器来编写每种类型的名称,但我需要一个解决方案来自动序列化每种类型的属性,而不必手动编写它们。

最佳答案

这可以通过 PolymorphicJsonAdapterFactory 完成,并在 json 中包含一个额外的属性来指定类型。

例如:

这个 JSON

{
"animals": [
{
"type": "dog",
"isGoodBoy": true
},
{
"type": "cat",
"remainingLives": 9
}
]
}

可以映射到下面的类

sealed class Animal {
@JsonClass(generateAdapter = true)
data class Dog(val isGoodBoy: Boolean) : Animal()

@JsonClass(generateAdapter = true)
data class Cat(val remainingLives: Int) : Animal()

object Unknown : Animal()
}

使用以下 Moshi 配置

Moshi.Builder()
.add(
PolymorphicJsonAdapterFactory.of(Animal::class.java, "type")
.withSubtype(Animal.Dog::class.java, "dog")
.withSubtype(Animal.Cat::class.java, "cat")
.withDefaultValue(Animal.Unknown)
)

关于android - 用 Moshi 序列化密封类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55934050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com