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

