Kotlin+Retrofit+Gson创建用户触发Gson解析类型不匹配报错如何解决
问题原因
你遇到的报错是Gson序列化不匹配导致的,具体根因有两个:
- 接口返回结构和你定义的实体类不匹配
你当前定义的UserResponse中data字段是User?(对象类型),但当创建用户请求参数校验失败时,gorest接口返回的data字段是错误信息数组,结构如下:
{ "code": 422, "meta": null, "data": [ {"field":"email","message":"已被占用"}, {"field":"status","message":"不能为空"} ] }
Gson期望解析对象却遇到数组,就抛出了该异常。
2. 你的User实体类缺少必填参数
gorest创建用户接口要求必须传name、email、gender、status四个参数,其中status只能填active或inactive,你当前的实体类没有定义status字段,请求参数不符合要求,必然触发校验失败返回错误数组。
解决方案
1. 补全User实体类的必填字段
@Entity @Parcelize data class User( val id: String?, val name: String?, val email: String?, val gender: String?, val status: String? // 新增必填字段 ) : Parcelable
2. 统一封装接口返回结构,兼容成功/失败场景
// 通用返回结构,用泛型适配不同接口的data类型 data class CommonResponse<T>( val code: Int?, val meta: Any?, val data: T? ) // 可选:定义错误信息结构,方便解析校验失败的提示 data class ErrorField( val field: String?, val message: String? )
3. 修改RetrofitService的createUser返回类型
@POST("users") @Headers("Accept:application/json", "Content-Type:application/json", "Authorization: Bearer c0e900498b9d4b6bec02d4cff795de8187cf751f9a6074c9645b0730f9dfc3dd") fun createUser(@Body params:User) : Call<CommonResponse<User>>
4. 补全创建用户时的参数
在AddAndUpdateActivity的createUser方法中,给User实例传入合法的status值:
// 示例:默认设置为active,你也可以新增输入项让用户选择状态 val user = User("", username, email, gender, "active")
5. 可选:增加返回日志排查问题
后续遇到类似问题,可以在请求回调中打印接口返回的原始报文,快速定位结构或参数问题。
内容的提问来源于stack exchange,提问作者Yellow Clock
相关产品推荐
相关产品推荐

