尝试使用Gson解析复杂的json对象。以下是失败的数据类:
data class Advisor(
val students: List<Student>?,
)
sealed class Student {
data class BusinessMajor(val name: String, val items: List<Courses>) : Student()
data class ArtsMajor(val name: String, val items: List<Courses>) : Student()
}
在运行时,我得到这个异常:
java.lang.RuntimeException:调用private失败com.mysite.myapp.ApiResponse$Student((,不带args
我读到这可以通过解析抽象类来创建,但我读到的所有帖子都是针对Java的。我看不到任何有助于Kotlin数据类的东西,特别是用sealed
类包装的。
感谢您的帮助。谢谢
密封类型类无法实例化:请参阅此处
密封类本身是抽象的,不能直接实例化,可以有抽象成员。
密封类不允许有非私有构造函数(默认情况下,它们的构造函数是私有的(。
它应该与Java中的工作方式相同。根据https://stackoverflow.com/a/21641225/9204:
val rta = RuntimeTypeAdapterFactory.of(Student::class.java)
.registerSubtype(Student.BusinessMajor::class.java)
.registerSubtype(Student.ArtsMajor::class.java)
val gson = new GsonBuilder()
.registerTypeAdapterFactory(rta)
.create()
但是:
通过这种方式,您需要为每个密封类编写一个工厂。也许有一个帮助库可以避免这个问题,但如果是这样的话,我还没有找到它
另请参阅为什么Kotlin数据类可以使用Gson在不可为null的字段中具有null?
总的来说,我强烈考虑使用Moshi或其他支持Kotlin的JSON库。