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

Android Retrofit2接收JSON编码异常,求解决方案

Retrofit2 JSON解析异常:Unexpected JSON token 问题解决

问题本质

报错显示解析JSON时遇到非预期的不可见字符( ),且响应内容是乱码,这说明接口返回的是压缩后的二进制数据(如gzip),但Retrofit的JSON转换器直接将其当作UTF-8文本解析。浏览器能正常显示是因为它会自动识别Content-Encoding头并解压,其他请求正常则是因为那些接口未启用压缩。

解决方案

  • 配置OkHttp自动处理压缩
    Retrofit默认的OkHttp客户端支持自动解压,但如果自定义了客户端,需确保请求头声明接受压缩,同时让OkHttp处理解压:

    val okHttpClient = OkHttpClient.Builder()
        .addInterceptor { chain ->
            val request = chain.request().newBuilder()
                .header("Accept-Encoding", "gzip, deflate")
                .build()
            chain.proceed(request)
        }
        .build()
    
    // 关联到Retrofit构建器
    Retrofit.Builder()
        .baseUrl(BASE_URL_API)
        .client(okHttpClient)
        .addConverterFactory(json.asConverterFactory("application/json; charset=UTF8".toMediaType()))
        .addCallAdapterFactory(ApiResponseCallAdapterFactory.create())
        .build()
    
  • 验证响应头信息
    通过OkHttp拦截器打印响应头,确认是否存在Content-Encoding: gzip:

    .addInterceptor { chain ->
        val response = chain.proceed(chain.request())
        Log.d("RespHeader", response.headers().toString())
        response
    }
    

    如果后端确实返回了压缩数据,要么让后端临时关闭该接口的压缩(不推荐),要么保持上述OkHttp配置。

  • 核对字符编码一致性
    确认后端返回的Content-Type头是否明确指定charset=UTF-8,如果后端使用了其他编码,需同步修改asConverterFactory中的媒体类型配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 01:42:34