微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Javalin框架中用kotlinx.serialization替换Jackson

如何解决在Javalin框架中用kotlinx.serialization替换Jackson

我正在尝试用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)
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。