【问题标题】:Android - Parse XML to JSONAndroid - 将 XML 解析为 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

【问题讨论】:

    标签: android json xml kotlin simple-framework


    【解决方案1】:

    您需要将此转换器工厂添加到您的 Retrofit Builder -

    Retrofit.Builder()
    .addConverterFactory(SimpleXmlConverterFactory.create())
    

    这允许 Retrofit 解释它正在获取的 XML 以转换为它的等效 JSON 数据对象。

    【讨论】:

    • 感谢您的回答!尝试了您的建议,现在我收到此错误:[构造函数不匹配]。在我看来,问题出在这个元素上,因为它在标签中包含多个数据:
    • 我很高兴它成功了,是的,尝试将它与您拥有的 xml 文档完全匹配。欲了解更多信息,您可以在这里查看 - stackoverflow.com/questions/37899858/…
    • 谢谢亲爱的,您的参考帮助我解决了问题! :)
    猜你喜欢
    • 2011-10-08
    • 1970-01-01
    • 2023-03-24
    • 2022-01-04
    • 1970-01-01
    • 2019-05-05
    • 2018-11-17
    • 2015-06-30
    • 1970-01-01
    相关资源
    最近更新 更多