问题描述
我正在尝试用Kotlinx.serialization替换默认的Javalin JSON序列化器Jackson。
文档显示了如何进行with GSON serializer。
不幸的是,kotlinx序列化器具有不同的功能签名,我不知道如何传递参数。
可以进行序列化,但是必须使用带有映射函数给定类型的targetClass
传递带有encodeFromString函数的序列化。
我被困在这里:
val kotlinx = Json { coerceInputValues = true }
Javalinjson.toJsonMapper = object : ToJsonMapper {
override fun map(obj: Any): String = kotlinx.encodetoString(obj)
}
Javalinjson.fromJsonMapper = object : FromJsonMapper {
override fun <T> map(json: String,targetClass: Class<T>): T = kotlinx.decodeFromString(json)
}
但是我得到:Cannot use 'T' as reified type parameter. Use a class instead.
我也尝试过:
Javalinjson.fromJsonMapper = object : FromJsonMapper {
override inline fun <reified T> map(json: String,targetClass: Class<T>): T = kotlinx.decodeFromString(json)
}
但是我得到警告:Override by an inline function
和错误:Override by a function with reified type parameter
。
我是kotlin
的新手,我一直在努力理解此覆盖的问题所在。
解决方法
尝试这个:
JavalinJson.toJsonMapper = object : ToJsonMapper {
override fun map(obj: Any): String {
val serializer = serializer(obj.javaClass)
return kotlinx.encodeToString(serializer,obj)
}
}
JavalinJson.fromJsonMapper = object : FromJsonMapper {
override fun <T> map(json: String,targetClass: Class<T>): T {
@Suppress("UNCHECKED_CAST")
val deserializer = serializer(targetClass) as KSerializer<T>
return kotlinx.decodeFromString(deserializer,json)
}
}