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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么kotlin jackson无法反序列化列表相关的知识,希望对你有一定的参考价值。

我有一个功能:

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函数,否则Jackson无法知道它应该转换为哪种类型。默认情况下,jackson会返回一个包含键及其值的地图。

因此,对于您的特定问题,您可以制作parse-function inline并添加reified到您传递的类型。这确保了实际类型也传递给杰克逊。另见reified types in the kotlin reference。或者你传递实际类型(使用TypeReference或类本身,如果它不是通用的)。

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

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

或者如果你使用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的具体方法。

以上是关于为什么kotlin jackson无法反序列化列表的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Jackson XML 直接在根元素内反序列化列表

Jackson XML 反序列化问题

使用 Jackson 反序列化重复键以列出

Jackson - 将内部对象列表反序列化为更高级别的列表

Jackson 没有反序列化已序列化的通用列表

使用 Jackson 反序列化对象列表