如何删除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
相关产品推荐
相关产品推荐

