Dariusz Kuc
02/12/2021, 9:37 PMKSerializer
that behaves similar to the built-in ones for primitives? e.g. I can deserialize Double
from Number (Int/Float) or String representation
var kotlinxDouble: Double = format.decodeFromString("""
0
""".trimIndent())
println(kotlinxDouble)
kotlinxDouble = format.decodeFromString("""
1.0
""".trimIndent())
println(kotlinxDouble)
kotlinxDouble = format.decodeFromString("""
"2.0"
""".trimIndent())
println(kotlinxDouble)
tried
object BigDecimalStringSerializer : KSerializer<BigDecimal> {
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("BigDecimal", PrimitiveKind.STRING)
override fun serialize(encoder: Encoder, value: BigDecimal) {
encoder.encodeString(value.toString())
}
override fun deserialize(decoder: Decoder): BigDecimal {
val raw = decoder.decodeString() // <-- blows up when not a String representation, i.e. on 0 and 1.0 values from above
return BigDecimal(raw)
}
}
Is there something like decoder.getRawValue
or something like that?Robert Jaros
02/12/2021, 10:42 PM1
and "1"
?Dariusz Kuc
02/12/2021, 10:54 PMDariusz Kuc
02/12/2021, 10:56 PMDariusz Kuc
02/12/2021, 10:56 PMString
Dariusz Kuc
02/12/2021, 10:57 PMDariusz Kuc
02/12/2021, 11:03 PM@JsonCreator/@JsonValue
to achieve this e.g. BigDecimal
example (end users provide the conversion logic to/from JSON using converter)
data class BigDecimalWrapper(val value: BigDecimal) {
@JsonValue
fun rawValue() = converter.toJson(value) // can serialize to whatever format
companion object {
val converter: BigDecimalConverter = BigDecimalConverter()
// can deserialize from Any
@JsonCreator
@JvmStatic
fun create(rawValue: Any) = BigDecimalWrapper(converter.toScalar(rawValue))
}
}
Dominaezzz
02/12/2021, 11:21 PMobject BigDecimalStringSerializer : KSerializer<BigDecimal> {
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("BigDecimal", PrimitiveKind.STRING)
override fun serialize(encoder: Encoder, value: BigDecimal) {
encoder.encodeString(value.toString())
}
override fun deserialize(decoder: Decoder): BigDecimal {
val input = decoder as JsonDecoder
val element = input.decodeJsonElement()
val raw = element.jsonPrimitive.content
return BigDecimal(raw)
}
}
Dariusz Kuc
02/13/2021, 1:53 AM