Reputation: 5335
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
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