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

如何使用 Jackson/kotlinx.serialization

如何解决如何使用 Jackson/kotlinx.serialization

我有一个通用类 class MyClass<T> : MyInterface<T>,我想将 json 反序列化为通用类型 T。我尝试使用 Jackson 和 kotlinx.serialization 库来反序列化 json,但出现以下错误

cannot use T as reified type parameter. Use class instead

我对为什么会发生这种情况的理解是因为 Jackson 和 kotlinx 反序列化函数都期望 reified T 但在我的班级中,无法在编译时知道 T 的类型。我对这个错误的理解正确吗?有什么办法可以解决这个错误吗?

我的代码片段

class MyClass<T> : MyInterface<T>{
    .... <some code> ...
    
    fun readFromJson(json: String){
        val obj = jacksonObjectMapper().readValue<T>(json)
        // same error if I use kotlinx Json.decodeFromString<T>(json)
        ...
    }
    .... <some code> ...
}

解决方法

我对为什么会发生这种情况的理解是因为 Jackson 和 kotlinx 反序列化函数都期望 reified T 但在我的班级中,无法在编译时知道 T 的类型。我对这个错误的理解正确吗?

正确。

有什么办法可以解决这个错误吗?

这取决于您要对相关 T 做什么。最好的办法是将 readFromJson() 从这个类中提升到一个可以真正实现 T 的地方。

如果你真的需要这个函数出现在你的类中(例如你需要访问一些内部状态或其他东西),那么你必须传递一个 KClass<T>/Class<T>(对于Jackson) 或 DeserializationStrategy<T>(用于 Kotlinx 序列化)到您的类的构造函数,以便您可以使用 readValue()decodeFromString() 的非具体化重载,将这些额外信息作为参数.

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