android - 在 kotlin 中使用 SimpleXML 序列化 retrofit xml 响应

标签 android kotlin retrofit2 simple-framework

我正在尝试使用 SimpleXML 将 retrofit xml 响应序列化为一个对象。

但是出现以下异常:

org.simpleframework.xml.core.ValueRequiredException: Unable to satisfy @org.simpleframework.xml.ElementList(data=false, empty=true, entry=, inline=true, name=ALLFile, required=true, type=void) on field '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 响应,因此可以排除我的请求逻辑问题。这让我相信问题在于序列化对象,有什么想法吗?

最佳答案

找到了解决这个问题的方法,不一定是答案,但它对我有用......

我将 XML 响应作为字符串,将其转换为 JSON 然后使用我常用的 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)

关于android - 在 kotlin 中使用 SimpleXML 序列化 retrofit xml 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54882744/

相关文章:

java - <service> MyFirebaseInstanceIdService 未在 list 中注册

oop - 在 kotlin 的接口(interface)中声明接口(interface)对象本身有什么好处

loops - 尽管 Kotlin 的 `Map` 不是 `Iterable` ,但它如何以及为什么可迭代?

android - 为什么 `findViewById` 返回 null? (使用 `by lazy` )

Android Retrofit 2 自定义 JSON 请求

java - 从 retrofit 查询中获取 map

java - 使改造省略未设置的查询参数

java - 如何配置调试版本以指向不同的 api?

java - 涉及 float 的表达式计算器的正则表达式

java - 我如何处理 pom.xml 文件?