Hey guys, I’m having troubles with the following s...
# serialization
c
Hey guys, I’m having troubles with the following serializer. What I’m trying to get:
Copy code
private var parser = kotlinx.serialization.json.Json(JsonConfiguration.Stable.copy(ignoreUnknownKeys = true))
var stringToParse = "{\"gvlSpecificationVersion\":2}"
var parsedReturn: VendorList = parser.parse(VendorList.serializer(), stringToParse)
My structure is the following:
Copy code
@Serializable
abstract class VendorList(
    open var lastUpdated: String?,
    open var gvlSpecificationVersion: Int?,
    open var vendorListVersion: Int?,
    open var tcfPolicyVersion: Int?,
    open var vendors: Map<String, Vendor>?,

    @Transient override var purposes: Map<String, Purpose>? = null,
    @Transient override var features: Map<String, Feature>? = null,
    @Transient override var specialFeatures: Map<String, Feature>? = null,
    @Transient override var specialPurposes: Map<String, Purpose>? = null,
    @Transient override var stacks: Map<String, Stack>? = null
): Declarations(
    purposes = purposes,
    features = features,
    specialFeatures = specialFeatures,
    specialPurposes = specialPurposes,
    stacks = stacks
)

@Serializable
open class Declarations(
    open var purposes: Map<String, Purpose>?,
    open var specialPurposes: Map<String, Purpose>?,
    open var features: Map<String, Feature>?,
    open var specialFeatures: Map<String, Feature>?,
    open var stacks: Map<String, Stack>?
)

@Serializable
data class Overflow (
    var httpGetLimit: Int
)

@Serializable
data class Vendor(
    var purposes: List<Int>,
    var legIntPurposes: List<Int>,
    var flexiblePurposes: List<Int>,
    var specialPurposes: List<Int>,
    var features: List<Int>,
    var specialFeatures: List<Int>,
    var policyUrl: String,
    var deletedDate: @ContextualSerialization Any?,
    var overflow: Overflow?,
    override var id: Int,
    override var name: String
): GVLMapItem

interface GVLMapItem {
    var id: Int
    var name: String
}

@Serializable
data class Purpose(
    var description: String,
    var descriptionLegal: String,
    override var id: Int,
    override var name: String
): GVLMapItem

@Serializable
data class Feature(
    var description: String,
    var descriptionLegal: String,
    override var id: Int,
    override var name: String
): GVLMapItem

@Serializable
data class Stack(
    var purposes: List<Int>,
    var specialFeatures: List<Int>,
    var description: String,
    override var id: Int,
    override var name: String
): GVLMapItem
I’m getting the following:
kotlin.Throwable: Key type is missing in the map.
Any help would mean a lot! Thanks!
s
I guess, that's because a
VendorList
is an abstract class, so polymorphic serialization is enabled. Such serialization requires
type
field in input to determine actual inheritor of the abstract class. Take a look here: https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/polymorphism.md