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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:28:27