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

