Retrofit2.6.2日志拦截器显示完整响应但response body返回null问题
问题根因定位&解决方案
从你给出的日志可以直接定位到核心问题,按优先级修复即可:
1、修复字段类型不匹配问题
你打印的响应日志里actionType实际返回的是1.0(浮点型),但你的BannerRes实体类中把actionType定义成了Int?类型,Gson反序列化时类型不匹配,虽然你开了setLenient()不会抛出崩溃,但会导致后续字段反序列化异常。
修复方案:把actionType的类型改为Double?或者Float?即可,不要用Int接收浮点型返回值。2、补全DataClass默认值
你当前的BannerRes所有字段都没有设置默认值,Kotlin不会自动生成无参构造函数,Gson反序列化Kotlin数据类时如果没有无参构造,会出现字段赋值失败的问题,这也是你明明转Json能看到完整字段,直接访问却返回null的核心原因。
修复方案:给BannerRes的所有字段加上默认值,示例如下:
data class BannerRes( @SerializedName("actionType") val actionType: Double? = null, @SerializedName("actionUrl") val actionUrl: String? = null, @SerializedName("activity") val activity: String? = null, @SerializedName("error") val error: Boolean? = null, @SerializedName("id") val id: String? = null, @SerializedName("imageUrl") val imageUrl: String? = null, @SerializedName("msg") val msg: String? = null, @SerializedName("visible") val visible: Boolean? = null )
- 3、可选优化&检查项
- 你的Retrofit配置里
ConverterFactory添加顺序不符合规范,ScalarsConverterFactory是用来处理字符串、基础类型等简单返回值的,需要放在自定义Bean的转换器前面,调整顺序如下:return Retrofit.Builder() .baseUrl(BuildConfig.BASE_URL) .addConverterFactory(ScalarsConverterFactory.create()) // 移到Gson前面 .addConverterFactory(GsonConverterFactory.create(gson)) .client(okHttpClient) .build() .create(MyApi::class.java) - 如果修复以上问题还是异常,检查是否开启了代码混淆,给
BannerRes加上@Keep注解,避免混淆时移除实体类字段和注解。
- 你的Retrofit配置里
修复完以上问题后即可正常访问res.body()?.msg字段。
内容的提问来源于stack exchange,提问作者Maruf Ahmed
相关产品推荐
相关产品推荐

