使用 Jackson 反序列化 XML 列表时出现 MismatchedInputException

问题描述 投票:0回答:1

我在反序列化某些包含对象列表的 XMl 时遇到问题。

为了重现它,我首先将给定对象序列化为 XML,然后尝试反序列化结果,但失败了。

这是我的示例代码:

fun main() {
    val test = CategoriesResponse(listOf(Category(1), Category(2)))
    val xmlMapper = XmlMapper()
    val xml: String = xmlMapper.writeValueAsString(test)
    println(xml)
    val testObject = xmlMapper.readValue(xml, CategoriesResponse::class.java)
    println(testObject)

}


@JacksonXmlRootElement(localName = "response")
data class CategoriesResponse
@JsonCreator
constructor(
    @field:JacksonXmlElementWrapper(localName = "categories")
    @field:JacksonXmlProperty(localName = "category")
    val categoryList: List<Category>
)

data class Category
@JsonCreator
constructor(
    @field:JacksonXmlProperty(isAttribute = true)
    val id: Int,
)

生成的 XML 恰到好处(此处格式化):

<response>
   <categories>
      <category id="1"/>
      <category id="2"/>
   </categories>
</response> 

我正在使用

implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-xml") 

这是我得到的例外:

Exception in thread "main" com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.util.ArrayList<Category>` from Object value (token `JsonToken.FIELD_NAME`)
 at [Source: (StringReader); line: 1, column: 11]
    at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)

任何帮助将不胜感激。 谢谢!

xml kotlin jackson
1个回答
0
投票

构造函数有问题。我认为

@JsonCreator
不适合 XML。考虑添加默认值,以便解析器通过触发空构造函数来实例化对象。

@JacksonXmlRootElement(localName = "response")
data class CategoriesResponse(
    @field:JacksonXmlElementWrapper(localName = "categories")
    @field:JacksonXmlProperty(localName = "category")
    val categoryList: List<Category> = listOf()
)

data class Category(
    @field:JacksonXmlProperty(isAttribute = true)
    val id: Int = -1
)
© www.soinside.com 2019 - 2024. All rights reserved.