如何在Kotlin中使用Retrofit发送含user嵌套结构的正确POST请求?
解决Retrofit请求体添加外层
user键的问题 方案一:创建包装类
定义一个专门的请求包装类,将User对象作为它的属性:
data class UserRequest( val user: User ) // 修改接口方法,使用包装类作为请求体参数 @Headers("Content-Type: application/json") @POST("users") suspend fun postUser(@Body userRequest: UserRequest)
当你创建UserRequest(User("Mike", "26"))并传入接口时,序列化后的JSON就会自动包含外层的user键。
方案二:使用Map构建请求体
如果不想额外创建类,可以直接用Map组装请求结构:
// 构建包含外层键的请求体Map val requestBody = mapOf( "user" to User("Mike", "26") ) // 接口方法参数改为接收Map类型 @Headers("Content-Type: application/json") @POST("users") suspend fun postUser(@Body requestBody: Map<String, User>)
Retrofit的序列化器(如Gson)会自动将该Map序列化为符合要求的JSON格式。
方案三:自定义序列化逻辑(以Gson为例)
若不想修改接口参数类型,可给User类添加自定义序列化适配器,但这种方式相对复杂,仅在必要时使用:
class UserWrapperAdapter : TypeAdapter<User>() { override fun write(out: JsonWriter, value: User) { out.beginObject() out.name("user") // 调用默认序列化逻辑处理User对象 val userAdapter = Gson().getAdapter(User::class.java) userAdapter.write(out, value) out.endObject() } override fun read(`in`: JsonReader): User { // 实现对应的反序列化逻辑 `in`.beginObject() `in`.nextName() // 跳过外层"user"键 val user = Gson().getAdapter(User::class.java).read(`in`) `in`.endObject() return user } } // 给User类添加适配器注解 @JsonAdapter(UserWrapperAdapter::class) data class User( val name: String, val age: String )
这种方式下,原接口方法无需修改,序列化时会自动为User对象套上user外层键。
内容的提问来源于stack exchange,提问作者Paul S
相关产品推荐
相关产品推荐

