首页 > 解决方案 > 将 JSON 反序列化为列表使用 Kotlin + Jackson - 反序列化异常

问题描述

我按照下面的链接使用 json 字符串中的映射器读取值,但是在执行我的代码时我可以看到一种反序列化异常,

如何使用 jackson 反序列化为 Kotlin 集合

代码:

private fun parseCountry(): List<Country> {
    val map = jacksonObjectMapper()
    val countryAsString = """[
                                {
                                  "countryCode": "IND",
                                  "countryName": "INDIA"
                                }
                             ]"""
    return map.readValue(countryAsString)
}

国家.kt

data class Country(
    val countryCode: String,
    val countryName: String)

例外:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is feign.codec.DecodeException: Error while extracting response for type [java.util.List<com.test.Country>] and content type [application/json;charset=UTF-8]; nested exception is 

org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of `java.util.ArrayList<com.test.Country>` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList<com.test.Country>` out of START_OBJECT token
 at [Source: (PushbackInputStream); line: 1, column: 1]

    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
    at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:72)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167)
    at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134)
    at com.financing.platform.mdc.filters.UserMdcFilter.doFilter(UserMdcFilter.java:23)
    at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134)

我试图挖掘这么多并找到根本原因,但无法找到,所以在这里与专家联系以寻求可能的解决方案。

PS:我使用的版本是

<kotlin.version>1.3.70</kotlin.version>
<jackson.version>2.9.10</jackson.version>

标签: arraysjsonkotlinjacksonjackson-databind

解决方案


Jackson 对 kotlin 数据类有疑问。因为它需要在属性中有一个默认的无参数构造函数和设置器。

为了解决这个问题,您可以将 kotlin 模块注册到 jackson 映射器,这样您就可以反序列化数据类而没有我们的问题。

首先,您必须添加依赖项

<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-kotlin</artifactId>
    <version>2.11.0</version>
</dependency>

然后在你的 jacksonObjectMapper 中注册模块

val mapper = ObjectMapper().registerModule(KotlinModule())

完成此操作后,它不应该失败

https://github.com/FasterXML/jackson-module-kotlin


推荐阅读