Retrofit 返回值序列化增加 JSONObject 类型支持
如 {"msg":"success","code":0,"data":{}}
对应类为
data class Result(val code: Int = 0, val msg: String = "", val data: JSONObject = JSONObject())
让结果 data 不再为空空花括号 { }
一、Retrofit 返回值序列化,变化部分设置为 JSONObject 解决方案
部分属性使用 JSONObject 类型声明后,接收到内容值一直为空,解决方案
- 自定义解析类型(反序列化)
继承JsonDeserializer<T>
实现自己的解析,仅针对 T 这类型生效,不影响其他类 - 将该类型增加至 Gson
// XX 为你最终要的类,XXType 为第一点自定义的类 val gson = GsonBuilder() .registerTypeAdapter(XX::class.java, XXType()) .create()
- 将该类添加到 GsonConverterFactory
GsonConverterFactory.create(gson)val retrofit = Retrofit.Builder() .baseUrl("http://localhost:8080/") .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create(gson)) .build()
详细的例子可以直接拉到文章下面查阅。
二、本文需求来源
在网络请求中,通常会以固定格式返回数据,方便客户端做解析,如 {"msg":"success","code":0,"data":{}}
,为了解析通用,一般会使用泛型来做数据解析,如下
data class Result<T>(val code:Int,val msg:String,val data:T)
data class UserInfo(val name:String)
声明接口
interface Api{
@Get("/login")
fun login():Observable<Result<UserInfo>>
//这种是不支持,反序列化必须知道具体类型,泛型会被擦除,所以无法得知具体类型抛出异常
//fun <T> login():Observable<Result<T>>
}
具体使用
fun test{
//省略
val api = retrofit.