Create a custom Serializer

The Serializer check the mapping value in the discriminator field
of the json we received to find the children Serializer
This commit is contained in:
lsiret 2022-12-20 14:09:30 -05:00
parent 755eb43a49
commit 7decab556b

View File

@ -38,6 +38,10 @@ import kotlinx.parcelize.Parcelize
import kotlinx.serialization.* import kotlinx.serialization.*
import kotlinx.serialization.descriptors.* import kotlinx.serialization.descriptors.*
import kotlinx.serialization.encoding.* import kotlinx.serialization.encoding.*
{{#discriminator}}import kotlinx.serialization.json.JsonContentPolymorphicSerializer
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.jsonObject
{{/discriminator}}
{{/multiplatform}} {{/multiplatform}}
{{#serializableModel}} {{#serializableModel}}
import java.io.Serializable import java.io.Serializable
@ -57,7 +61,7 @@ import {{packageName}}.infrastructure.ITransformForStorage
{{#parcelizeModels}} {{#parcelizeModels}}
@Parcelize @Parcelize
{{/parcelizeModels}} {{/parcelizeModels}}
{{#multiplatform}}{{^discriminator}}@Serializable{{/discriminator}}{{/multiplatform}}{{#kotlinx_serialization}}{{#serializableModel}}@KSerializable{{/serializableModel}}{{^serializableModel}}@Serializable{{/serializableModel}}{{/kotlinx_serialization}}{{#moshi}}{{#moshiCodeGen}}@JsonClass(generateAdapter = true){{/moshiCodeGen}}{{/moshi}}{{#jackson}}{{#discriminator}}{{>typeInfoAnnotation}}{{/discriminator}}{{/jackson}} {{#multiplatform}}@Serializable{{#discriminator}}(with = {{classname}}Serializer::class){{/discriminator}}{{/multiplatform}}{{#kotlinx_serialization}}{{#serializableModel}}@KSerializable{{/serializableModel}}{{^serializableModel}}@Serializable{{/serializableModel}}{{/kotlinx_serialization}}{{#moshi}}{{#moshiCodeGen}}@JsonClass(generateAdapter = true){{/moshiCodeGen}}{{/moshi}}{{#jackson}}{{#discriminator}}{{>typeInfoAnnotation}}{{/discriminator}}{{/jackson}}
{{#isDeprecated}} {{#isDeprecated}}
@Deprecated(message = "This schema is deprecated.") @Deprecated(message = "This schema is deprecated.")
{{/isDeprecated}} {{/isDeprecated}}
@ -146,3 +150,13 @@ import {{packageName}}.infrastructure.ITransformForStorage
{{#vendorExtensions.x-has-data-class-body}} {{#vendorExtensions.x-has-data-class-body}}
} }
{{/vendorExtensions.x-has-data-class-body}} {{/vendorExtensions.x-has-data-class-body}}
{{#discriminator}}
internal object {{classname}}Serializer : JsonContentPolymorphicSerializer<{{classname}}>({{classname}}::class) {
override fun selectDeserializer(element: JsonElement) = when {
{{#mappedModels}}
"{{mappingName}}" in element.jsonObject["{{discriminatorName}}"].toString() -> {{modelName}}.serializer()
{{/mappedModels}}
else -> {{classname}}.serializer()
}
}{{/discriminator}}