Android中GsonConverter解析GitLab JSON遇格式错误问题排查
问题原因及解决方法
核心问题
你碰到的两个解析错误,本质是实际获取到的响应不是预期的纯JSON数组,而是其他内容(比如GitLab文件的网页HTML),导致Gson无法正常解析。
错误拆解
MalformedJsonException:因为拿到的不是合法JSON(比如HTML代码),Gson直接识别失败。expected begin_array but was string:开启宽松解析后,Gson尝试处理内容,但发现拿到的是字符串(HTML文本),而非预期的JSON数组,因此报错。
解决步骤
1. 修正GitLab JSON文件的访问URL
必须用GitLab提供的原始文件URL,不能用仓库文件的网页链接:
- 打开GitLab里的JSON文件,点击页面右上角的「Raw」按钮,复制此时浏览器地址栏的URL,这个链接返回的是纯JSON内容。
- 如果用网页URL,GitLab会返回带UI的HTML页面,根本不是纯JSON,这是最常见的坑。
2. 确认JSON文件本身的合法性
你提供的JSON格式是合法的,但要确保GitLab上的文件:
- 没有多余的前缀/后缀字符(比如开头的空格、结尾的换行符、隐藏的BOM头)
- 编码是UTF-8,没有乱码
可以把GitLab上的内容复制到Android Studio里,用IDE自带的JSON校验功能检查格式。
3. 调整Retrofit配置与接口定义
- 确保接口方法返回数组类型:
interface CountryApi { @GET("your-json-file-relative-path") suspend fun getCountries(): List<WSCountry> // 用Call的话写:Call<List<WSCountry>> } - 如果确实需要宽松解析(仅针对JSON格式的小问题),正确配置Gson:
val lenientGson = GsonBuilder() .setLenient() .create() fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit = Retrofit.Builder() .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create(lenientGson)) .baseUrl(BASE_URL) .build()
4. 打印响应内容排查问题
添加OkHttp日志拦截器,查看实际返回的内容:
val loggingInterceptor = HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY } val okHttpClient = OkHttpClient.Builder() .addInterceptor(loggingInterceptor) .build()
看Logcat里的响应体,如果是HTML,说明URL错了;如果是JSON,再检查格式是否和你本地的一致。
内容的提问来源于stack exchange,提问作者Nicolas DUBOSCQ
相关产品推荐
相关产品推荐

