[英]How to implement polymorphic list deserialization with GSON in Kotlin?
我有一个返回列表的数据馈送,该列表可能是三种类型之一(比如类型 A、B 和 C)。 以上所有类型共享 2 个属性,其余属性特定于类型。 我尝试使用该模式。
abstract class Parent (val type: String, val id: String)
和
data class TypeA(override val type: String ... )
data class TypeB(override val type: String ... )
我正在使用 Retrofit 并尝试将列表反序列化为
List<? extends Parent>
在 Kotlin 中应该是
List<out Parent>
然而,GSON 在实例化抽象的父类时抛出了反序列化错误。
java.lang.RuntimeException: Failed to invoke public com.XX.Parent() with no args
有什么想法可以在 Kotlin 中实现吗?
当您在问题中标记了 Moshi 时,我将为您提供一种使用 MOshi 的PolymorphicJsonAdapterFactory
进行此操作的方法。 根据对象属性的值,您基本上可以将某些东西解析为不同的类型。
您要做的第一件事是将您的父类型声明为密封类,并让其他类型从它扩展:
sealed class Parent(val type: String){
data class TypeA(override val type: String, ... ): Parent(type)
data class TypeB(override val type: String, ... ): Parent(type)
}
现在你要告诉 Moshi 如何解析Parent
对象。 你这样做注册一个PolymorphicJsonAdapterFactory
:
val moshi = Moshi.Builder()
.add(PolymorphicJsonAdapterFactory.of(Parent::class.java, "type")
.withSubtype(TypeA::class.java, "typeA")
.withSubtype(TypeB::class.java, "typeB")
.build()
这样,如果属性“type”的值为“typeA”,它将反序列化为TypeA
实例。 与TypeB
一样,如果属性“type”是“typeB”
你可以在这里看另一个例子: https ://github.com/square/moshi/blob/master/adapters/src/main/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactory.java
我认为您需要添加“ extends”修饰符(在Kotlin中为“ : “),并将参数传递给Parent的构造函数,如下所示:
data class TypeA(override val type: String, val id: String) : Parent(type, id)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.