我在反序列化某些包含对象列表的 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)
任何帮助将不胜感激。 谢谢!
构造函数有问题。我认为
@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
)