You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解析含同名元素的XML?Retrofit+Jackson解析异常处理

Retrofit+Jackson解析重复XML节点的正确方案

问题场景

需要解析Retrofit返回的XML结构,其中包含多个重复的<subdata>节点:

<data>
    <id>1</id>
    <subdata>
        <id>1a</id>
    </subdata>
    <subdata>
        <id>1b</id>
    </subdata>
</data>

使用Jackson作为ConverterFactory的Retrofit配置如下:

Retrofit.Builder()
    .baseUrl("https://www.web.com/")
    .addConverterFactory(JacksonConverterFactory.create(XmlMapper()
        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
        .registerKotlinModule()))
    .build().create(DataApiService::class.java)

最初尝试的数据类定义如下,运行时抛出属性冲突异常:

data class Data(
    val id: String,
    @JacksonXmlProperty(localName = "subdata")
    val subdata1: SubData,
    @JacksonXmlProperty(localName = "subdata")
    val subdata2: SubData
)

data class SubData(
    val id: String,
)

报错信息:

IllegalArgumentException: Conflicting getter definitions for property "subdata": com.data.model.Data#getSubdata1() vs com.data.model.Data#getSubdata2()

解决方案

错误原因

XML中重复的<subdata>属于同类型的集合元素,不能定义两个独立的属性来接收。Jackson会将两个标注了相同localName的属性识别为同一个字段,从而抛出getter冲突异常。

正确数据类定义

使用List<SubData>来接收多个<subdata>节点,并通过@JacksonXmlElementWrapper(useWrapping = false)关闭自动包裹(因为原XML没有外层的集合包裹节点,比如<subdatas>):

data class Data(
    val id: String,
    @JacksonXmlProperty(localName = "subdata")
    @JacksonXmlElementWrapper(useWrapping = false)
    val subdata: List<SubData>
)

data class SubData(
    val id: String
)

配置说明

原Retrofit中的XmlMapper配置无需修改,保持registerKotlinModule()和FAIL_ON_UNKNOWN_PROPERTIES = false即可,确保Kotlin数据类的序列化/反序列化兼容性,同时忽略未知属性避免解析失败。

内容的提问来源于stack exchange,提问作者NullPointerException

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 11:12:20