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

Retrofit POST请求:如何处理请求与响应中同名的data JSON对象?

解决Retrofit中请求/响应同名data字段的模型类编写问题

嗨,我懂你碰到的麻烦了——把请求和响应的字段塞进同一个Model类里,导致序列化工具(比如Gson)识别到重复的data字段,直接抛出“multiple fields having same name”错误。其实思路很简单:把请求模型和响应模型彻底分开,因为它们的data字段类型不同,本身就是两个独立的结构呀!

第一步:拆分请求与响应的Model类

咱们分别创建两个data class,一个专门用来封装要上传的请求数据,另一个用来接收服务器返回的响应数据:

1. 请求模型类(用于上传数据)

这个类只包含请求结构里的data字段(以及请求可能有的其他字段,如果有的话):

// 上传时的请求模型
data class PostRequest(
    @SerializedName("data") val data: PostDataFieldsModel
    // 如果请求还有其他字段,比如token之类的,直接加在这里就行
)

// 你原来的请求data字段的具体结构
data class PostDataFieldsModel(
    // 这里放请求data里的具体字段,比如:
    val username: String,
    val content: String
)

2. 响应模型类(用于接收返回数据)

这个类包含响应结构里的data、status、message字段:

// 接收响应的模型
data class PostResponse(
    @SerializedName("status") val status: String,
    @SerializedName("message") val message: String,
    @SerializedName("data") val data: PostResponseDataFieldsModel
)

// 你原来的响应data字段的具体结构
data class PostResponseDataFieldsModel(
    // 这里放响应data里的具体字段,比如:
    val id: Int,
    val createTime: String
)

第二步:在Retrofit接口中使用这两个模型

接下来在你的Retrofit Service接口里,分别指定请求体和响应体的类型就可以了:

interface ApiService {
    @POST("your-api-endpoint-path")
    suspend fun submitData(
        @Body request: PostRequest
    ): Response<PostResponse>
}

为什么之前的写法会报错?

你之前把请求的data(PostDataFieldsModel类型)和响应的data(PostResponseDataFieldsModel类型)放在同一个类里,哪怕你给其中一个改了变量名data1并加了@SerializedName("data"),序列化工具依然会认为这两个字段都要映射到JSON里的data键,自然就会出现“同名字段冲突”的错误啦。分开写之后,两个模型各自负责自己的结构,就不会有这个问题了。

内容的提问来源于stack exchange,提问作者Jaydip Kalkani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:55:41