Android(Java)使用Retrofit无POJO发送原始JsonObject转义反斜杠问题
Retrofit 提交JsonObject出现多余反斜杠修复方案
问题本质
出现大量转义反斜杠的核心原因是Retrofit的序列化转换器将JsonObject实例当做普通字符串做了二次JSON序列化,和你在Activity之间做JsonObject转字符串、再转回JsonObject的逻辑没有关系,问题100%出在Retrofit接口定义、Converter配置、传参姿势三个环节。
分步修复方案
- 第一步:修正Retrofit接口定义
删掉接口上的@FormUrlEncoded注解,禁止把JsonObject放到@Field、@Query参数里传递,@Body注解的参数类型直接写JsonObject,不要写成String:// 错误写法(会触发二次转义) @FormUrlEncoded @POST("your/submit/path") Call<Resp> submit(@Field("data") JsonObject json); @POST("your/submit/path") Call<Resp> submit(@Body String jsonStr); // 正确写法 @POST("your/submit/path") Call<Resp> submit(@Body JsonObject json); - 第二步:修正Retrofit初始化配置
确保Retrofit实例添加了GsonConverterFactory,不要同时添加多个存在冲突的JSON转换器,不要给Gson实例配置针对JsonObject的自定义序列化/反序列化适配器:Gson gson = new GsonBuilder().setLenient().create(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(YOUR_BASE_URL) // GsonConverterFactory必须添加,且不要被其他自定义Converter覆盖优先级 .addConverterFactory(GsonConverterFactory.create(gson)) .build(); - 第三步:100%生效兜底方案
如果上述配置修改后仍有问题,可以直接绕开Retrofit的自动序列化逻辑,手动构造JSON格式的RequestBody提交,完全规避二次转义问题:// 你之前解析得到的JsonObject实例 JsonObject targetJson = JsonParser.parseString(storedJsonString).getAsJsonObject(); // 构造标准JSON请求体 RequestBody jsonBody = RequestBody.create( MediaType.parse("application/json; charset=utf-8"), targetJson.toString() ); // 接口定义调整为接收RequestBody @POST("your/submit/path") Call<Resp> submit(@Body RequestBody body); // 直接发起请求即可 api.submit(jsonBody).enqueue(/* 你的回调逻辑 */);
避坑提醒
不要使用手动替换字符串中反斜杠的方案(比如
str.replace("\\","")),这种方案会破坏JSON结构中本身合法的转义字符,直接导致服务端解析失败。
内容的提问来源于stack exchange,提问作者Rahul Pandey
相关产品推荐
相关产品推荐

