Retrofit无法解析JSON数据,响应码201但实体类无数据如何排查?
Retrofit请求响应码201但实体类解析不到数据排查方案
1. 检查Retrofit转换器配置
- 确保引入了对应JSON解析库的Converter依赖,以Gson为例:
// build.gradle 依赖配置 implementation 'com.squareup.retrofit2:converter-gson:你的retrofit版本号'
- 初始化Retrofit时必须添加对应的Converter Factory:
val retrofit = Retrofit.Builder() .baseUrl(BASE_URL) // 必须加这行,否则无法自动解析JSON到实体类 .addConverterFactory(GsonConverterFactory.create()) .build()
2. 检查响应JSON结构是否匹配实体类
绝大多数解析为空的问题都是因为实体类结构和接口返回结构不匹配:
- 接口返回大概率是嵌套了外层通用响应结构,示例如下:
{ "code": 201, "message": "操作成功", "data": { "otp": "123456", "otpId": 1001 } }
如果是这种结构,你需要先定义通用外层响应类,再嵌套你的业务实体类:
// 通用外层响应类 data class BaseResponse<T>( @SerializedName("code") val code: Int? = null, @SerializedName("message") val message: String? = null, @SerializedName("data") val data: T? = null ) // 修改ApiService返回值 @POST("sms-otp/request") suspend fun loginTest(@Body testRequest: TestRequest): Response<BaseResponse<TestResponse>>
3. 检查字段匹配规则
- 确认
@SerializedName注解的值和返回JSON的字段名完全一致,包括大小写,比如返回字段是otpid全小写,你写otpId就会匹配失败 - 如果创建Gson实例时开启了
excludeFieldsWithoutExposeAnnotation()配置,必须给所有要解析的字段加上@Expose注解,否则可以删除无用的@Expose注解 - 如果开启了代码混淆,必须给TestResponse类添加混淆豁免规则,避免字段名被混淆后无法匹配
4. 打印原始响应确认返回内容
可以通过OkHttp日志拦截器打印完整的响应报文,确认接口是否真的返回了你需要的业务数据:
// 引入日志拦截器依赖 implementation 'com.squareup.okhttp3:logging-interceptor:你的okhttp版本号'
// 配置OkHttp客户端 val loggingInterceptor = HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY } val okHttpClient = OkHttpClient.Builder() .addInterceptor(loggingInterceptor) .build() // Retrofit初始化时传入okHttpClient val retrofit = Retrofit.Builder() .baseUrl(BASE_URL) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .build()
配置后可以在Logcat中看到完整的接口请求和响应内容,直接确认返回结构是否符合预期。
内容的提问来源于stack exchange,提问作者kysclient
相关产品推荐
相关产品推荐

