Переопределение поля Kotlin и десериализация GSON Невозможно создать исключение класса преобразователя - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть родительский класс в Kotlin как этот

open class Prescription(
open var name: String,
open val id: String,
open var dose: JsonElement?,
open var schedule: JsonElement?,
open var notes: String?,
@SerializedName("as_needed")
open var isAsNeeded: Boolean,
open var archiveDate: Long?) {
constructor(name: String, dose: JsonElement?, schedule: JsonElement?, isAsNeeded: Boolean, notes: String?)
    : this(
    id = name.toLowerCase() + "-" + UUID.randomUUID().toString().subSequence(0, 6),
    name = name,
    dose = dose,
    schedule = schedule,
    isAsNeeded = isAsNeeded,
    archiveDate = null,
    notes = notes
)
}

И дочерний класс как этот

class Medication(
    override var name: String,
    override var dose: JsonElement?,
    override var schedule: JsonElement?,
    override var isAsNeeded: Boolean,
    override var notes: String?,
    override var id: String,
    val other: String?,
) : Topic, Prescription(
    name = name,
    dose = dose,
    schedule = schedule,
    isAsNeeded = isAsNeeded,
    notes = notes
)

, когда я пытаюсь десериализовать Medication класс с GSON Я получаю IllegalArgumentException, говоря, что Medication class declares multiple JSON fields named dose. Я не уверен, как дублируются поля при добавлении override к полям.Какой будет правильный способ сделать это в Kotlin + GSON

1 Ответ

0 голосов
/ 30 декабря 2018
class Medication(
     name: String,
     dose: JsonElement?,
     schedule: JsonElement?,
     isAsNeeded: Boolean,
     notes: String?,
     id: String,
     val other: String?,
) : Topic, Prescription(
    name,
    dose,
    schedule,
    isAsNeeded,
    notes
)

попробуйте выше ... в классе Medication нет необходимости переопределять переменную.

Поскольку имя, доза, график, isAsNeeded, примечания уже объявленыв суперклассе нет необходимости переопределять, вы можете использовать их напрямую.

open class Prescription(
protected var name: String,
protected val id: String,
protected var dose: JsonElement?,
protected var schedule: JsonElement?,
protected var notes: String?,
@SerializedName("as_needed")
protected var isAsNeeded: Boolean,
protected var archiveDate: Long?) {
constructor(name: String, dose: JsonElement?, schedule: JsonElement?, isAsNeeded: Boolean, notes: String?)
    : this(
    id = name.toLowerCase() + "-" + UUID.randomUUID().toString().subSequence(0, 6),
    name = name,
    dose = dose,
    schedule = schedule,
    isAsNeeded = isAsNeeded,
    archiveDate = null,
    notes = notes
)
}

И я считаю, что защита вашего var / val в вашем суперклассе более предпочтительна.

...