arrays - 将 JSON 反序列化为列表使用 Kotlin + Jackson - 反序列化异常
问题描述
我按照下面的链接使用 json 字符串中的映射器读取值,但是在执行我的代码时我可以看到一种反序列化异常,
代码:
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>
解决方案
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())
完成此操作后,它不应该失败
推荐阅读
- ios - Swift iOS14 动画约束
- python - 如何设置超时来终止 nginx 工作人员?
- javascript - 我的文件(pdf、xlsx、docx ..)在 Reactjs 中被下载损坏或有错误
- android - 列表不断重置
- java - 在两个 maven 模块中使用不同的 lombok 版本
- angular - 注销时如何清理ngrx存储
- spring-integration-dsl - Spring 集成 - SimpleWsOutboundGateway 错误处理(SOAP WS)
- javascript - 文档 styleSheets 使用伪选择器获取元素上的所有样式
- java - 如何正确编写将字符串解析为 char、java 的 if 语句
- python - Selenium Python 不能在 Chrome 中使用 options.add_argument("--headless")