简体   繁体   中英

Android Retrofit + SimpleXMLConverter in Kotlin

I'm trying to get Retrofit and the SimpleXmlConverter working on my Kotlin Android project (I've only used json before, for obvious reasons), and keep running into various errors. Right now the error is "Unable to satisfy...ElementList... on method 'itemsList'".

I'm ultimately trying to get the list of elements into a Kotlin List. Below is the XML response and the classes I've wrote to deserialize.

Anything jumping out?

Edit: I've also tried setting required = false for all of the Element and ElementList annotations, when I do so it doesn't error but I don't get anything back in the list.

XML Response

<?xml version="1.0" encoding="UTF-8"?>
<response xmlns="" xmlns:xsd="" xmlns:xsi="">
   <result>
      <status>
         <code>0000</code>
         <statusMessage>The status message</statusMessage>
      </status>
      <item>
         <code>1</code>
         <display>One</display>
      </item>
      <item>
         <code>2</code>
         <display>Two</display>
      </item>
      <item>
         <code>3</code>
         <display>Three</display>
      </item>
   </result>
</response>

Response.kt

@Root(name = "response", strict = false)
class Response {
    @get:Element(name = "status", required = false)
    @set:Element(name = "status", required = false)
    @Path("result")
    var status: ResponseStatus? = null

    @get:ElementList(name = "item", inline = true, required = true)
    @set:ElementList(name = "item", inline = true, required = true)
    @Path("result")
    var itemsList: List<Items>? = null
}

Items.kt

@Root(name = "item", strict = false)
class Items {
    @get:Element(name = "code", required = true)
    @set:Element(name = "code", required = true)
    var code: String? = null

    @get:Element(name = "display", required = true)
    @set:Element(name = "display", required = true)
    var display: String? = null
}

ResponseStatus.kt

@Root(name = "status", strict = false)
class ResponseStatus {

    @get:Element(name = "code", required = false)
    @set:Element(name = "code", required = false)
    var code: String? = null

    @get:Element(name = "statusMessage", required = false)
    @set:Element(name = "statusMessage", required = false)
    var statusMessage: String? = null
}

I'm trying to find where I found the code that worked. But basically need to do this in the Model:

@Root(name = "response", strict = false)
class Response @JvmOverloads constructor(
  @field: Element(name = "result")
  var result: Result? = null
)

@Root(name = "result", strict = false)
class Result @JvmOverloads constructor(
  @field: ElementList(inline = true)
  var itemsList: List<Items>? = null
)

@Root(name = "item", strict = false)
class Item @JvmOverloads constructor(
  @field Element(name = "code", required = false)
  var code: String = ""
  @field Element(name = "display", required = false)
  var display: String = ""
)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM