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

