如何解析含同名元素的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
相关产品推荐
相关产品推荐

