Android - 将 XML 解析为 JSON
Posted
技术标签:
【中文标题】Android - 将 XML 解析为 JSON【英文标题】:Android - Parse XML to JSON 【发布时间】:2021-10-31 22:21:57 【问题描述】:我的用例要求我获取格式如下的 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()
我尝试在 SimpleXml (com.squareup.retrofit2:converter-simplexml:2.9.0) 的帮助下创建响应模型,但到目前为止还没有成功。我不断收到此错误:
com.squareup.moshi.JsonDataException:应为 BEGIN_OBJECT,但在路径 $ 处为 STRING
任何人都可能知道如何将此结构映射到 Json?提前谢谢!
响应模型:
@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?
)
解决方案
改造建造者:
Retrofit.Builder()
.addConverterFactory(SimpleXmlConverterFactory.create())
.baseUrl(BASE_URL)
.client(okHttpClient)
.build()
型号:
@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
这个链接也可能有帮助Kotlin - parsing Xml response with list using SimpleXml
【问题讨论】:
【参考方案1】:您需要将此转换器工厂添加到您的 Retrofit Builder -
Retrofit.Builder()
.addConverterFactory(SimpleXmlConverterFactory.create())
这允许 Retrofit 解释它正在获取的 XML 以转换为它的等效 JSON 数据对象。
【讨论】:
感谢您的回答!尝试了您的建议,现在我收到此错误:[构造函数不匹配]。在我看来,问题出在这个元素上,因为它在标签中包含多个数据:以上是关于Android - 将 XML 解析为 JSON的主要内容,如果未能解决你的问题,请参考以下文章
Android:解析 XML DOM 解析器。将子节点转换为字符串