gpt4 book ai didi

exception - 为什么 kotlin jackson 不能反序列化列表

转载 作者:行者123 更新时间:2023-12-04 20:28:30 47 4
gpt4 key购买 nike

我有一个功能:

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 无法知道它应该转换为哪种类型。默认情况下,jackson 只返回一个带有键及其值的映射。

因此,对于您的特定问题,您可以制作 parse - function inline并添加一个 reified到您传递的类型。这可确保实际类型也传递给 Jackson。另见 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 的具体化方法。

关于exception - 为什么 kotlin jackson 不能反序列化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52115857/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com