Estoy intentando serializar una respuesta xml de actualización en un objeto usando SimpleXML.
Sin embargo, se produce la siguiente excepción:
org.simpleframework.xml.core.ValueRequiredException: No se puede satisfacer @org.simpleframework.xml.ElementList(data=false, empty=true, entry=, inline=true, name=ALLFile, required=true, type=void) en campo 'archivos'
Ejemplo de respuesta:
<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>Objetos:
@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)Recibo una respuesta 200 del servidor, por lo que puedo descartar la lógica de mi solicitud como el problema. Lo que me lleva a creer que el problema radica en serializar los objetos, ¿alguna idea?
Encontré una forma de evitar esto, no necesariamente la respuesta, pero funciona para mí ...
Tomé la respuesta XML como una cadena, la convertí a JSON y luego usé mi biblioteca de serialización JSON habitual ( moshi ) para serializar el JSON en un objeto.
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() }Y lo llamó así:
val myObject = parseResponse(response.body()!!.string(), MyJsonClass::class.java)