2

我正在尝试用 Kotlinx.serialization 替换默认的Javalin JSON 序列化程序 Jackson。

该文档显示了如何使用 GSON 序列化程序来完成。
不幸的是,kotlinx 序列化程序具有不同的函数签名,我无法弄清楚如何传递参数。

序列化是可以的,但使用 decodeFromString 函数的反序列化需要传递映射函数给定的类型为targetClass.

我被困在这里:

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,我正在努力理解这个覆盖有什么问题。

4

1 回答 1

2

试试这个:

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)
    }
}
于 2020-10-09T18:28:54.810 回答