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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:50:33