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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 22:15:30