snowe
06/29/2022, 11:16 PMclass EitherSerializer<R>(
private val leftSerializer: KSerializer<PricingError>,
private val rightSerializer: KSerializer<R>,
) : KSerializer<Either<PricingError, R>> {
override val descriptor: SerialDescriptor
get() = rightSerializer.descriptor
private val errorJson = Json {
ignoreUnknownKeys = true
isLenient = true
encodeDefaults = true
}
override fun deserialize(decoder: Decoder): Either<PricingError, R> {
require(decoder is JsonDecoder) { "only works in JSON format" }
val element = Either.catch {
decoder.decodeJsonElement()
}.mapLeft { PricingError.SerializationError(it.localizedMessage) }
return when (element) {
is Either.Left -> element
is Either.Right -> {
try {
decoder.json.decodeFromJsonElement(rightSerializer, element.value).right()
} catch (_: SerializationException) {
errorJson.decodeFromJsonElement(leftSerializer, element.value).left() // fails here with error in thread
}
}
}
}
override fun serialize(encoder: Encoder, value: Either<PricingError, R>) {
TODO("Not yet implemented")
}
}
snowe
06/29/2022, 11:17 PM2022-06-29 17:04:43,935 ERROR [io.qua.ama.lam.run.AbstractLambdaPollLoop] (Lambda Thread (DEVELOPMENT)) Failed to run lambda (DEVELOPMENT): kotlinx.serialization.json.internal.JsonDecodingException: Polymorphic serializer was not found for missing class discriminator ('null')
JSON input: {"errorType":"test","errorMessage":"response","version":"null:null"}
at kotlinx.serialization.json.internal.JsonExceptionsKt.JsonDecodingException(JsonExceptions.kt:24)
at kotlinx.serialization.json.internal.JsonExceptionsKt.JsonDecodingException(JsonExceptions.kt:32)
at kotlinx.serialization.json.internal.PolymorphicKt.throwSerializerNotFound(Polymorphic.kt:76)
at kotlinx.serialization.json.internal.PolymorphicKt.decodeSerializableValuePolymorphic(Polymorphic.kt:66)
at kotlinx.serialization.json.internal.AbstractJsonTreeDecoder.decodeSerializableValue(TreeJsonDecoder.kt:51)
at kotlinx.serialization.json.internal.TreeJsonDecoderKt.readJson(TreeJsonDecoder.kt:24)
at kotlinx.serialization.json.Json.decodeFromJsonElement(Json.kt:119)
at com.sunrun.pricing.flex.helpers.serialization.EitherSerializer.deserialize(EitherSerializer.kt:59)
at com.sunrun.pricing.flex.helpers.serialization.EitherSerializer.deserialize(EitherSerializer.kt:35)
at kotlinx.serialization.json.internal.PolymorphicKt.decodeSerializableValuePolymorphic(Polymorphic.kt:59)
at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:38)
at kotlinx.serialization.json.Json.decodeFromString(Json.kt:100)
snowe
06/29/2022, 11:17 PMobject Serialization {
val json: Json by lazy {
Json {
ignoreUnknownKeys = true
isLenient = true
classDiscriminator = "productType"
encodeDefaults = true
serializersModule = polySerializers
}
}
}
, left serializer is in the EitherSerializersnowe
06/29/2022, 11:22 PMsnowe
06/30/2022, 12:05 AMsnowe
06/30/2022, 4:25 PMDominaezzz
06/30/2022, 9:02 PMsnowe
06/30/2022, 9:03 PMDominaezzz
06/30/2022, 9:03 PMdecodeJsonElement()
? That's going to lead to some seriously weird behaviour in more complex cases.snowe
06/30/2022, 9:04 PMDominaezzz
06/30/2022, 9:05 PMI want to map kotlinx serialization failures to typesThis is illegal. You cannot do this.
Dominaezzz
06/30/2022, 9:05 PMsnowe
06/30/2022, 9:05 PMDominaezzz
06/30/2022, 9:06 PMephemient
06/30/2022, 9:06 PMDominaezzz
06/30/2022, 9:06 PMsnowe
06/30/2022, 9:06 PMephemient
06/30/2022, 9:07 PMephemient
06/30/2022, 9:07 PMsnowe
06/30/2022, 9:07 PMDominaezzz
06/30/2022, 9:08 PMsnowe
06/30/2022, 9:10 PMPricingError
.ephemient
06/30/2022, 9:10 PMJsonContentPolymorphicSerializer
. hard to tell given the lack of detailsnowe
06/30/2022, 9:10 PMDominaezzz
06/30/2022, 9:12 PMDominaezzz
06/30/2022, 9:12 PMsnowe
06/30/2022, 9:12 PMDominaezzz
06/30/2022, 9:13 PMDominaezzz
06/30/2022, 9:14 PMsnowe
06/30/2022, 9:14 PM