Следующее создаст исключение 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
}
}
Я счастлив, что мне нужно использовать пользовательский адаптер для записиимя каждого типа, но мне нужно решение, которое будет автоматически сериализовать свойства для каждого типа, а не писать их все вручную.