You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin+Retrofit+Gson创建用户触发Gson解析类型不匹配报错如何解决

问题原因

你遇到的报错是Gson序列化不匹配导致的,具体根因有两个:

  1. 接口返回结构和你定义的实体类不匹配
    你当前定义的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 21:36:06