Vaibhav Jaiswal
02/01/2024, 1:29 PM@Serializable
sealed interface PostMediaDto {
companion object {
val serializerModule = SerializersModule {
polymorphic(PostMediaDto::class){
subclass(Image::class)
subclass(Link::class)
defaultDeserializer { NotImplemented.serializer() }
}
}
}
@Serializable
@SerialName("IMAGE")
data class Image(val data: List<String>) : PostMediaDto
@Serializable
@SerialName("LINK")
data class Link(val data: List<String>) : PostMediaDto
@Serializable
data object NotImplemented : PostMediaDto
}
jw
02/01/2024, 2:48 PMVaibhav Jaiswal
02/01/2024, 2:49 PMVaibhav Jaiswal
02/01/2024, 2:49 PMjw
02/01/2024, 2:58 PMVaibhav Jaiswal
02/01/2024, 3:03 PMjw
02/01/2024, 3:03 PMjw
02/01/2024, 3:04 PMjw
02/01/2024, 3:04 PMjw
02/01/2024, 3:06 PMjw
02/01/2024, 3:06 PMVaibhav Jaiswal
02/01/2024, 3:07 PMVaibhav Jaiswal
02/05/2024, 7:22 AMdefaultDeserializer
not possible to be used with closed polymorphism using sealed interfaces?
Does it need to be open polymorphism?Vaibhav Jaiswal
02/05/2024, 7:31 AMkotlin("jvm")
project
@Serializable
sealed interface Animal {
companion object {
val serialModule = SerializersModule {
polymorphic(Animal::class){
subclass(Cat::class)
subclass(Dog::class)
defaultDeserializer { Human.serializer() }
}
}
}
@Serializable
@SerialName("CAT")
data object Cat: Animal
@Serializable
@SerialName("DOG")
data object Dog: Animal
@Serializable
data object Human: Animal
}
fun main(){
val json = """
[
{
"type": "DOG"
},
{
"type": "CAT"
},
{
"type": "RABBIT"
}
]
""".trimIndent()
val serializer = Json {
this.serializersModule = SerializersModule {
include(Animal.serialModule)
}
}
serializer.decodeFromString<List<Animal>>(json)
.also { println(it.toString()) }
}