【问题标题】:Why kotlin jackson can't deserialize list为什么 kotlin jackson 不能反序列化列表
【发布时间】:2018-08-31 12:50:03
【问题描述】:

我有一个函数:

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

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

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

【问题讨论】:

    标签: exception kotlin jackson jvm


    【解决方案1】:

    您需要将类型传递给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 的具体方法。

    【讨论】:

    • 我编辑了帖子。 jackson kotlin 模块的变体不起作用
    • 你试过reified吗?
    • 同样的错误?还是另一种?您是从外部传递整个类型还是混合传递?
    • 是的,仍然抛出 ClassCastException。
    • 你还可以做什么:尝试先序列化一个类似的对象,然后看看你得到了什么..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    相关资源
    最近更新 更多