Котлин Гсон с классами данных - PullRequest
0 голосов
/ 29 октября 2019

Попытка разобрать сложный объект json с помощью Gson. Вот классы данных, которые терпят неудачу:

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: Не удалось вызвать частный com.mysite.myapp.ApiResponse $ Student () без аргументов

Я читал, что это можно создать, пытаясь разобрать абстрактные классы, но все прочитанные мной сообщения относятся к Java. Я не вижу ничего, что могло бы помочь с классами данных Kotlin, особенно с классом sealed.

Любая помощь приветствуется. Спасибо.

Ответы [ 2 ]

1 голос
/ 29 октября 2019

Классы закрытых типов не могут быть созданы: см. Здесь

Запечатанный класс сам по себе является абстрактным, его нельзя создать напрямую и иметь абстрактные члены.

Запечатанным классам не разрешено иметь не приватные конструкторы (по умолчанию их конструкторы являются закрытыми).

0 голосов
/ 29 октября 2019

Должно работать так же, как в 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()

Но:

  1. Таким образом, вам нужно написать фабрику для каждого запечатанного класса. Может быть, есть вспомогательная библиотека, чтобы избежать этой проблемы, но если так, я не нашел ее.

  2. См. Также Почему классы данных Kotlin могут иметь значения NULL в ненулевых поляхс Gson?

В целом, я бы настоятельно рекомендовал использовать Moshi или другую библиотеку JSON с поддержкой Kotlin.

...