如何用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
相关产品推荐
相关产品推荐

