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

Android 使用Retrofit实现XML转JSON 解析报错问题及解决方案

问题描述
  • 业务需求:需要将如下格式的XML数据映射为JSON对象
<settings>
<client ip="......" lat="...." lon="...." isp="...." country="...."/>
<translation lang="xml"> </translation>
</settings>
  • 初始配置:使用Retrofit发起请求,转换器工厂采用Moshi,配置代码如下:
Retrofit.Builder()
    .addConverterFactory(MoshiConverterFactory.create(moshi).asLenient())
    .baseUrl(BASE_URL)
    .client(okHttpClient)
    .build()
  • 问题表现:尝试引入com.squareup.retrofit2:converter-simplexml:2.9.0依赖,通过SimpleXml创建响应模型实现解析时持续失败,报错信息如下:

com.squareup.moshi.JsonDataException: Expected BEGIN_OBJECT but was STRING at path $

  • 原有错误响应模型代码:
@Root(name = "settings", strict = false)
data class ConfigurationEntity(

    @field:Attribute(name = "client", required = false)
    @param:Attribute(name = "client", required = false)
    val client: ClientEntity?
)
@Root(name = "client")
data class ClientEntity(

    @field:Attribute(name = "ip", required = false)
    @param:Attribute(name = "ip", required = false)
    val ip: String?,

    @field:Attribute(name = "lat", required = false)
    @param:Attribute(name = "lat", required = false)
    val lat: String?,

    @field:Attribute(name = "lon", required = false)
    @param:Attribute(name = "lon", required = false)
    val lon: String?,

    @field:Attribute(name = "isp", required = false)
    @param:Attribute(name = "isp", required = false)
    val isp: String?,

    @field:Attribute(name = "country", required = false)
    @param:Attribute(name = "country", required = false)
    val country: String?
)
解决方案

1. 调整Retrofit转换器配置

将原有的Moshi转换器替换为SimpleXml转换器,配置如下:

Retrofit.Builder()
    .addConverterFactory(SimpleXmlConverterFactory.create())
    .baseUrl(BASE_URL)
    .client(okHttpClient)
    .build()

2. 调整实体模型定义

@Root(name = "settings", strict = false)
class ConfigurationEntity {

    @field:Element(required = false)
    lateinit var client: ClientEntity
}
@Root(name = "client", strict = false)
class ClientEntity {

    @field:Attribute
    lateinit var ip: String

    @field:Attribute
    lateinit var lat: String

    @field:Attribute
    lateinit var lon: String

    @field:Attribute
    lateinit var isp: String

    @field:Attribute
    lateinit var country: String
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:48:03