Как проанализировать xml ответ с помощью модернизации в kotlin? - PullRequest
0 голосов
/ 14 марта 2020

У меня есть следующий ответ:

<?xml version="1.0" encoding="utf-8" ?>
<rsp stat="ok">
    <photos page="1" pages="3704" perpage="100" total="370320">
        <photo id="49658592343" owner="138998919@N06" secret="0db4e03977" server="65535" farm="66" title="mmm " ispublic="1" isfriend="0" isfamily="0" />
        <photo id="49658586758" owner="156045424@N06" secret="2444dda679" server="65535" farm="66" title="Boeing 787-9 (G-CKOG) Norwegian Airlines" ispublic="1" isfriend="0" isfamily="0" />
        <photo id="49659129251" owner="156045424@N06" secret="97d1bd202e" server="65535" farm="66" title="Boeing 787-9 (G-CKOG) Norwegian Airlines" ispublic="1" isfriend="0" isfamily="0" />
         </photos>
</rsp>

, и я использую SimpleXmlConverterFactory в качестве модифицированного конвертера. Я преобразовал вышеуказанный ответ в json через онлайн-конвертер и создал из него класс данных, Родительский класс выглядит следующим образом:

data class ResponseImages(
    val photos: Photos,
    val stat: String
)

, но я получаю эту ошибку каждый раз, когда запускаю приложение:

org.simpleframework.xml.core.AttributeException: Attribute 'stat' does not have a match in class com.abx.cbz.Response.ResponseImages at line -1

, так что я здесь не так делаю?

1 Ответ

0 голосов
/ 15 марта 2020

Читая различные потоки SO, мне удалось заставить его работать, используя следующий блок кода:

@Root(name = "photos")
data class Photos @JvmOverloads constructor(

    @field:Attribute(name = "page")
    @param:Attribute(name = "page")
    var page: String,

    @field:Attribute(name = "pages")
    @param:Attribute(name = "pages")
    var pages: String,

    @field:Attribute(name = "perpage")
    @param:Attribute(name = "perpage")
    var perpage: String,

    @field:ElementList(name = "photo", inline = true)
    @param:ElementList(name = "photo", inline = true)
    var photo: List<Photo>,

    @field:Attribute(name = "total")
    @param:Attribute(name = "total")
    var total: String
)

Этот же формат должен использоваться и для других классов данных, я только отображаю один. Должен быть пустой конструктор, поэтому я использовал @JvmOverloads, но использование аннотации @param пока не очень понятно, краткая идея в том, что мы должны заставить Kotlin генерировать перегрузки конструктора.

...