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

如何用Retrofit将XML响应转换为数据类

解决Retrofit+Jackson解析XML响应的问题

你之前的问题出在默认的JacksonConverterFactory只支持JSON解析,没有配置XML解析能力,所以会把XML当成JSON处理,触发解析错误。按下面步骤调整即可解决:

1. 引入Jackson XML解析依赖

确保项目添加了Jackson处理XML的依赖(版本和你现有Jackson保持一致即可):

  • Groovy Gradle:
implementation 'com.fasterxml.jackson.module:jackson-module-kotlin:2.15.+'
implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.+'
  • Kotlin DSL:
implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.15.+")
implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.+")

2. 配置支持XML的ObjectMapper

创建专门处理XML的XmlMapper,并注册Kotlin模块以适配Kotlin数据类:

val xmlMapper = XmlMapper().apply {
    // 注册Kotlin模块,支持Kotlin数据类的序列化/反序列化
    registerModule(KotlinModule())
    // 可选:忽略XML中未定义在数据类里的字段,避免解析报错
    configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
}

3. 给Retrofit配置XML转换器

用上面配置好的xmlMapper创建JacksonConverterFactory,替换原来的默认工厂:

Retrofit.Builder()
    .baseUrl("https://www.myapi.com/")
    .addConverterFactory(JacksonConverterFactory.create(xmlMapper))
    .build()
    .create(DataApiService::class.java)

4. 给数据类添加XML注解(关键)

要让Jackson正确映射XML节点,需要给数据类加上Jackson的XML注解,示例如下:

// 指定XML根节点名称
@JacksonXmlRootElement(localName = "api_response")
data class ApiResponse(
    // 指定对应XML子节点的名称
    @JacksonXmlProperty(localName = "data_list")
    val dataList: List<DataItem>,
    @JacksonXmlProperty(localName = "return_code")
    val returnCode: Int
)

data class DataItem(
    @JacksonXmlProperty(localName = "item_id")
    val itemId: String,
    @JacksonXmlProperty(localName = "item_name")
    val itemName: String
)

这样配置后,Retrofit就能正确识别并解析XML响应了。

内容的提问来源于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 23:38:12