chiroptical
04/30/2023, 9:53 PMchiroptical
04/30/2023, 9:54 PMEmil Kantis
04/30/2023, 10:03 PMJsonTransformingSerializer
for that.
inline fun <reified T : Any> objectWrappingSerializer(fieldName: String) = object : JsonTransformingSerializer<T>(serializer()) {
override fun transformSerialize(element: JsonElement): JsonElement {
return buildJsonObject {
put(fieldName, element)
}
}
override fun transformDeserialize(element: JsonElement): JsonElement {
return element.jsonObject[fieldName]!!
}
}
create your serializer like:
object MyValueClassSerializer :KSerializer<MyValueClass> by objectWrappingSerializer("fieldName")
@Serializable(with = MyValueClassSerializer::class)
value class MyValueClass(..)
chr
05/03/2023, 2:55 AMserializer()
we're trying to reference in the argument is the serializer that we're trying to construct in objectWrappingSerializer(...)
Emil Kantis
05/03/2023, 5:04 PMobjectWrpapingSerializer
works..Emil Kantis
05/03/2023, 5:04 PM@Serializable
@JvmInline
private value class PersonName(val value: String)
object PersonNameSerializer : KSerializer<PersonName> by objectWrappingSerializer("name")
class ObjectWrappingSerializerTest : FreeSpec(
{
"Serializes correctly" {
Json.encodeToString(PersonNameSerializer, PersonName("John")) shouldEqualJson """{"name":"John"}"""
}
},
)
Passes now that we're creating the auto-generated serializer first