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
相关产品推荐
相关产品推荐

