Сериализация ответа xml для модификации с SimpleXML в kotlin - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь сериализовать ответ xml для модификации в объект, используя SimpleXML.

Однако возникает следующее исключение:

org.simpleframework.xml.core.ValueRequiredException: Невозможно удовлетворить @ org.simpleframework.xml.ElementList (data = false,пусто = true, запись =, inline = true, name = ALLFile, обязательно = true, type = void) в поле 'files' '

Пример ответа:

<LIST> 
   <ALLFile>
      <File>
         <NAME>SOME FILE NAME</NAME>
         <FPATH>SOME FILE PATH</FPATH>
         <SIZE>160053622</SIZE>
         <TIMECODE>1299673239</TIMECODE>
         <TIME>2018/11/23 14:04:46</TIME>
         <ATTR>33</ATTR>
      </File>
   </ALLFile>
   <ALLFile> 
      <File> 
	 <NAME>SOME FILE NAME</NAME>
         <FPATH>SOME FILE PATH</FPATH>
         <SIZE>160053622</SIZE>
         <TIMECODE>1299673559</TIMECODE>
         <TIME>2018/11/23 14:14:46</TIME>
         <ATTR>33</ATTR>
      </File>
   </ALLFile>
</LIST>

Объекты:

@Root(name = "LIST", strict = false)
data class ListResponse @JvmOverloads constructor(
    @field:ElementList(name = "ALLFile", inline = true) var files: List<GetVideosResponse>? = null
)

@Root(strict = false, name = "File")
data class GetVideosResponse @JvmOverloads constructor(
    @field:Element(name = "NAME", required = false) var name: String? = null,
    @field:Element(name = "FPATH", required = false) var fPath: String? = null,
    @field:Element(name = "SIZE", required = false) var size: Int? = null,
    @field:Element(name = "TIMECODE", required = false) var timeCode: Long? = null,
    @field:Element(name = "TIME", required = false) var time: String? = null,
    @field:Element(name = "ATTR", required = false) var attr: Int? = null)

Я получаю 200 ответ от сервера, поэтому могу исключить мою логику запросакак проблема.Что заставляет меня верить, что проблема заключается в сериализации объектов, каких-либо идей?

1 Ответ

0 голосов
/ 01 марта 2019

Нашел способ обойти это, не обязательно ответ, но он работает для меня ...

Я взял ответ XML в виде строки, преобразовал его в JSON *Затем 1006 * использовал мою обычную библиотеку сериализации JSON ( moshi ) для сериализации JSON в объект.

private fun parseXmlToJsonObject(xml: String) : String {
    var jsonObj: JSONObject? = null
    try {
        jsonObj = XML.toJSONObject(xml)
    } catch (e: JSONException) {
        Log.e("JSON exception", e.message)
        e.printStackTrace()
    }

    return jsonObj.toString()
}

fun<T> parseResponse(xml: String, clazz: Class<T>) : T {
    try {
        return initializeMoshi().adapter(clazz).fromJson(parseXmlToJsonObject(xml))!!
    }catch (e: IOException){
        throw IllegalArgumentException("Could not deserialize: $xml into class: $clazz")
    }
}

private fun initializeMoshi(): Moshi {
    return Moshi.Builder()
        .add(KotlinJsonAdapterFactory())
        .build()
}

И назвал это так:

val myObject = parseResponse(response.body()!!.string(), MyJsonClass::class.java)
...