如何解决如何使用 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 举报,一经查实,本站将立刻删除。