为什么 kotlin jackson 无法反序列化列表

2023-12-28

我有一个功能:

inline fun <reified T : Any>parse(result: String): T  = mapper.readValue<Response<T>>(result).someValue

当我传递列表类型时,例如List<MyClass>,并尝试从中获取一些项目,我得到以下异常:

Exception in thread "ForkJoinPool.commonPool-worker-3" 
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to MyClass

您需要将类型传递给readValue-function,否则Jackson无法知道它应该转换成哪种类型。默认情况下,杰克逊只返回一个包含键及其值的映射。

因此,对于您的特定问题,您可以将parse-function inline并添加一个reified到你传递的类型。这确保了实际类型也传递给 Jackson。也可以看看kotlin 参考中的具体化类型 https://kotlinlang.org/docs/reference/inline-functions.html#reified-type-parameters。或者,您传递实际类型(使用TypeReference或者类本身(如果它不是通用的)。

之前这个答案还包含了如何将 json 列表反序列化为实际列表的一般信息,我将其留在这里供参考:

mapper.readValue(result, object : TypeReference<List<MyClass>>() {})

或者如果你使用Jackson 模块 kotlin https://github.com/FasterXML/jackson-module-kotlin:

mapper.readValue<List<MyClass>>(result)

应用于您的函数,可能如下所示:

inline fun <reified T : Any>parse(result: String): T  = mapper.readValue(result, object : TypeReference<T>() {})

或使用 jackson-module-kotlin:

inline fun <reified T : Any>parse(result: String): T  = mapper.readValue(result)

那么调用它就只是:

val yourObjList = parse<List<MyClass>>(yourJson)
// or
val yourObjList : List<MyClass> = parse(yourJson)

请注意,我使用了reified(这意味着inline)。如果你不使用reified实际类型不会传递给 jackson-module-kotlin 的具体化方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 kotlin jackson 无法反序列化列表 的相关文章

随机推荐