Android Studio中Retrofit GET请求异常:非空响应触发onFailure
问题根源分析
兄弟,从你贴的日志错误和JSON响应来看,核心问题很明确:
接口返回的reservationDate是字符串格式(比如"2019-10-30"),但你的ScheduleModel里用了Java 8的LocalDate类型——而Gson默认根本不支持把字符串直接转成LocalDate对象!
这就导致:当响应体有数据时,Gson解析到reservationDate字段直接卡壳,触发了Retrofit的onFailure;而响应体为空时没东西要解析,所以能顺利进入onResponse。
解决方案
给你两个靠谱的解决办法,按需选就行:
方法1:给Gson加LocalDate解析适配器(推荐长期用)
Gson本身不支持Java 8的日期API,得加个适配器来处理LocalDate的序列化和反序列化。
第一步:添加依赖
在Module级别的build.gradle里加入这两个依赖:
implementation 'com.google.code.gson:gson:2.10.1' implementation 'com.google.gson:gson-type-adapters:2.10.1'
第二步:修改Retrofit的Gson配置
把你ScheduleService里创建Retrofit的代码改成这样,注册LocalDate的适配器:
companion object { fun create(): ScheduleService{ // 先创建支持LocalDate解析的Gson实例 val gson = GsonBuilder() .registerTypeAdapter(LocalDate::class.java, LocalDateTypeAdapter()) .create() val retrofit = Retrofit.Builder() .baseUrl("myUrl") .addConverterFactory(GsonConverterFactory.create(gson)) .build() return retrofit.create(ScheduleService::class.java) } }
这样Gson就能自动把接口返回的日期字符串转成LocalDate对象,完美解决解析问题。
方法2:先改成String类型临时救急
如果不想折腾依赖,先把数据类里的reservationDate改成String,先确保请求能拿到数据,之后再手动转成LocalDate:
data class ScheduleModel( val id: Int, val reservationDate: String // 把LocalDate换成String类型 )
拿到数据后手动转换日期:
override fun onResponse(call: Call<List<ScheduleModel>>, response: Response<List<ScheduleModel>>) { if (response.code() == 200) { response.body()?.forEach { schedule -> // 手动将字符串转为LocalDate val localDate = LocalDate.parse(schedule.reservationDate) // 这里处理你的业务逻辑 } Toast.makeText(applicationContext, "It's ok", Toast.LENGTH_SHORT).show() } }
额外提个醒
你接口返回的id是字符串"4",但数据类里定义的是Int——Gson默认能把数字字符串转成Int,一般没问题,但如果以后接口返回非数字的id就会报错,建议如果接口的id是字符串类型,最好把数据类的id也改成String哦。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

