Android中设置Gson Lenient后仍报JsonReader格式错误JSON如何解决?
解决Retrofit设置Gson宽松模式仍报错:Use JsonReader.setLenient(true)的问题
问题分析
你已经尝试通过GsonBuilder.setLenient()创建宽松模式的Gson实例,但仍收到相同报错,大概率是以下原因之一:
- 自定义的宽松Gson实例未被正确应用到Retrofit配置中
- 服务器返回的内容并非可被宽松Gson解析的JSON格式(比如HTML错误页、纯文本、空内容等)
解决方案
1. 确保宽松Gson实例被正确配置到Retrofit
检查你的getService方法,原代码中使用默认的GsonConverterFactory.create(),并未传入你创建的宽松Gson实例。修改代码如下:
public static <T> T getService(Class<T> serviceClass){ // 请求响应拦截器 HttpLoggingInterceptor interceptor=new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() { @Override public void log(String message) { System.out.println(message); } }).setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient okHttpClient=new OkHttpClient.Builder().addInterceptor(interceptor).build(); // 创建宽松模式的Gson实例 Gson gson = new GsonBuilder() .setLenient() .create(); Retrofit retrofit=new Retrofit.Builder() .baseUrl("http://172.20.4.47:8080/") .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create(gson)) // 传入自定义宽松Gson .build(); return retrofit.create(serviceClass); }
2. 检查服务器返回的响应内容
通过你配置的HttpLoggingInterceptor打印的日志,查看响应体部分:
- 如果返回的是HTML页面(比如404/500错误页)、纯文本或空内容,说明接口并未返回JSON,此时宽松Gson也无法解析。需要排查服务器接口是否正常,或是否存在权限、路径错误等问题。
- 如果返回的是存在格式小问题的JSON(比如多余的逗号、注释),宽松模式应该可以正常解析。
3. 适配非JSON响应(如果需要)
如果接口确实返回非JSON格式(比如纯文本),需要在Retrofit中添加对应的ConverterFactory,比如添加ScalarsConverterFactory来处理字符串响应:
// 先添加ScalarsConverterFactory,优先处理字符串 .addConverterFactory(ScalarsConverterFactory.create()) .addConverterFactory(GsonConverterFactory.create(gson))
内容的提问来源于stack exchange,提问作者selfish rui
相关产品推荐
相关产品推荐

