Retrofit 返回值序列化增加 JSONObject 类型

本文介绍了如何在Retrofit中处理返回值为JSONObject的情况,通过自定义Gson解析器,实现对部分属性为JSONObject的数据序列化。具体示例展示了如何在接口中声明JSONObject类型并成功解析响应数据。
摘要由CSDN通过智能技术生成

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 类型声明后,接收到内容值一直为空,解决方案

  1. 自定义解析类型(反序列化)
    继承 JsonDeserializer<T> 实现自己的解析,仅针对 T 这类型生效,不影响其他类
  2. 将该类型增加至 Gson
    // XX 为你最终要的类,XXType 为第一点自定义的类
    val gson = GsonBuilder()
            .registerTypeAdapter(XX::class.java, XXType())
            .create()
    
  3. 将该类添加到 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.
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值