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

如何将Map转换为OkHttp RequestBody避免添加额外反斜杠?

解决Map转OkHttp RequestBody时斜杠被额外转义的问题

问题出在你自定义的toRequestBody()扩展函数里的JSON序列化配置——默认的序列化逻辑会对斜杠/进行转义,而实际上JSON规范允许斜杠直接存在,不需要转义。下面给出两种常用序列化库的正确实现:

方法一:使用Gson实现

通过Gson的配置禁用HTML转义,就能避免斜杠被转义:

import com.google.gson.GsonBuilder
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.RequestBody
import okhttp3.RequestBody.Companion.toRequestBody

// 初始化Gson时禁用HTML转义
private val gson = GsonBuilder()
    .disableHtmlEscaping()
    .create()

// 自定义Map转RequestBody的扩展函数
fun Map<String, Any>.toRequestBody(): RequestBody {
    val jsonStr = gson.toJson(this)
    return jsonStr.toRequestBody("application/json; charset=utf-8".toMediaType())
}

测试代码不变,此时输出的JSON字符串中斜杠不会被转义,符合你的期望。

方法二:使用Moshi实现

Moshi默认不会对斜杠进行转义,实现更简洁:

import com.squareup.moshi.Moshi
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.RequestBody
import okhttp3.RequestBody.Companion.toRequestBody

private val moshi = Moshi.Builder().build()
private val mapJsonAdapter = moshi.adapter(Map::class.java)

fun Map<String, Any>.toRequestBody(): RequestBody {
    val jsonStr = mapJsonAdapter.toJson(this)
    return jsonStr.toRequestBody("application/json; charset=utf-8".toMediaType())
}

关键说明

JSON规范中,斜杠/属于可直接使用的字符,转义后的\/虽然合法,但并非必要。只要调整序列化库的配置,关闭不必要的转义逻辑,就能得到你想要的输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 07:17:25