Abhishek Bansal
Abhishek Bansal

Reputation: 5335

Kotlin field overriding and GSON deserialization Unable to create converter class exception

I have a parent class in Kotlin like this

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
)
}

And a child class like this

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
)

when I am trying to deserialize Medication class with GSON I get IllegalArgumentException saying that Medication class declares multiple JSON fields named dose. I am not sure how fields are duplicating when override is added to fields. What would be correct way of doing this in Kotlin + GSON

Upvotes: 1

Views: 811

Answers (1)

Anmol
Anmol

Reputation: 8670

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

try above... in Medication class there is no need of overriding the variable.

As name, dose, schedule, isAsNeeded, notes are already declared in the super class there is no need of overriding you can directly use them.

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
)
}

And i believe keeping your var/val protected in your super class is more preferable.

Upvotes: 2

Related Questions