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

如何删除JsonObject的根节点名称,将内部属性直接作为JSON请求体发送?

问题原因

你外层多出来的session_permit节点是TalkJoinCredentialsRequestData类的字段名,Retrofit序列化请求体时会自动把请求类的字段名作为JSON键,你把实际要发送的内容嵌套在了这个字段下,就多了一层包装。

解决方案

有两种可行修改方式:

方案1:直接传递JsonObject作为请求体

删除TalkJoinCredentialsRequestData类的封装,直接修改接口的Body参数类型为JsonObject:

interface TalkJoinCredentialsApiInterface
{
    @POST("Prod/channel/join/Test")
    @Headers("Content-type: application/json",
        "Accept: */*")
    fun joinCredentialData(
        @Body requestData : JsonObject
    ) : Call<TalkJoinCredentialsResponseData>
}

调用接口时直接传入你构造好的JsonObject即可:

var jsonObject = JsonObject()
jsonObject.addProperty("sessionID", session_permit.sessionID)
jsonObject.addProperty("participantID", session_permit.participantID)
jsonObject.addProperty("timestamp", session_permit.timestamp)
jsonObject.addProperty("signature", session_permit.signature)

// 无需再封装成TalkJoinCredentialsRequestData,直接传jsonObject
api.joinCredentialData(jsonObject)

方案2:调整请求体类结构

把请求体类的字段直接替换成你要发送的四个属性,去掉嵌套的JsonObject:

class TalkJoinCredentialsRequestData(
   var sessionID: String,
   var participantID: Int,
   var timestamp: Long,
   var signature: String
)

调用时直接传入对应参数构造请求体:

var requestData = TalkJoinCredentialsRequestData(
    sessionID = session_permit.sessionID,
    participantID = session_permit.participantID,
    timestamp = session_permit.timestamp,
    signature = session_permit.signature
)
api.joinCredentialData(requestData)

以上两种方案生成的请求体都没有外层根节点,符合你需要的格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:48:03