我在子化一些包含对象列表的XM时遇到了问题.

为了重现它,我首先将给定对象序列化为HTML,然后try 重新序列化结果,但失败了.

这是我的示例代码:

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,
)

生成的ML刚刚好(格式在此处):

<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不适合用于ML.考虑添加默认值,以便解析器通过触发对象的空构造器来实例化对象.

@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
)

Kotlin相关问答推荐

了解Kotlin函数

Compose:LaunchedEffect在密钥更改后不会重新启动

我如何测试一个可组合组件没有显示,但如果它不存在也接受?

找不到有效的 Docker 环境

Kotlin中用于调用常量名称的枚举类方法之间的区别

循环中的每个元素都应填充行中可用的所有可用空间

如何从 var list 或可变列表中获取列表流

如何创建扩展函数isNullOrEmpty?

如何在 android jetpack compose 中相互重叠列表项?

从代码块执行和返回(在 Elvis 运算符之后)

如何使用Kotlin Dokka记录主构造函数参数

如果 Maybe 完成,则从其他来源将 Maybe 转换为 Single

如何为kotlin异常生成SerialVersionId?

如何在特定条件下清除jetpack数据存储数据

从命令行运行Java到Kotlin转换器?

在Kotlin中为Android编写库会有开销吗?

如何在Kotlin中使方法param可变?

不推荐使用仅限生命周期的LifecycleEvent

什么是 Kotlin 等价于 Class<?>

Android studio,构建kotlin时出现奇怪错误:生成错误代码