本文主要是介绍Retrofit 配合泛型数据返回错误 Expected BEGIN_ARRAY but was STRING,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Expected BEGIN_ARRAY but was STRING at line 1 column 41 path $.result.xxx
问题源头就是在转换工厂进行数据转换的时候出现错误,
这里是需要Array类型却捕捉到String,所以解析错误,
解析的BaseResponse.kt
data class BaseResponse<T> (val code:String,val msg:String,val result:T)
比如是一个正常的获取通知接口,你可能需要一个Response
data class NoticeResponse (val noticeList:MutableList<NoticeInfo>){data class NoticeInfo (val title:String,val info:String,val createTime:String)
}
请求结果处理
abstract class TConsumer<T> : Consumer<BaseResponse<T>> {override fun accept(t: BaseResponse<T>) {try {val resCode = t.codeif ("0" == resCode) {onSuccess(t.result)} else {onFailed(resCode,t.msg)}} catch (e: Exception) {onFailed(ErrorStatus.API_ERROR,e.message.toString())}}abstract fun onSuccess(response: T)abstract fun onFailed(errCode: String, errMsg: String)
}
然后在subscribe中的成功代码
object:TConsumer<NoticeResponse>(){override fun onSuccess(response:NoticeResponse){it.onGetNoticeSuccess(response)// MVP 中View的实现方法}
}
偏偏就出错了,获取数据后发现,返回的数据时这个样子的:
{"code":"0","msg":"处理成功","result":"{"noticeList":[{"title":"通知标题","info":"通知信息。。。","createTime":"2018-12-12"},{"title":"通知标题","info":"通知信息。。。","createTime":"2018-12-12"},{"title":"通知标题","info":"通知信息。。。","createTime":"2018-12-12"}]}"}
问题就出在下图中的双引号
我们的数据解析需要的是一个泛型T,在这个例子里是MutableList<NoticeInfo>,但是解析result节点却出现了字符串数据,所以
Expected BEGIN_ARRAY but was STRING
实际上这个是后台的数据类型错误造成的,
相应的数据类型结构是:
{"code": "0","msg": "处理成功","result": {"noticeList": [{"title": "通知标题","info": "通知信息。。。","createTime": "2018-12-12"},{"title": "通知标题","info": "通知信息。。。","createTime": "2018-12-12"},{"title": "通知标题","info": "通知信息。。。","createTime": "2018-12-12"}]}
}
外层的Map中存在三个变量:
Map<String,Object> ->code:Stringmsg:Stringresult:Map<String,Object> // 我们的泛型T就是这里的result//结果在返回的时候 转换成了// result:Map<String,String>
实际上这种问题出现的频率不高,一般在项目初期可能遇到,跟服务器沟通好就不会出现问题,以此类推:
Expected BEGIN_OBJECT but was BEGIN_ARRAY
是解析时需要一个Object,返回的却是一个Array,
// 解析的时候,开始如果是 " 开头,代表是字符换
// 如果是 [ 开头,表示Array或者List
// 如果是 { 则代表对象
以上对号入座
这篇关于Retrofit 配合泛型数据返回错误 Expected BEGIN_ARRAY but was STRING的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!