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

Android中GsonConverter解析GitLab JSON遇格式错误问题排查

问题原因及解决方法

核心问题

你碰到的两个解析错误,本质是实际获取到的响应不是预期的纯JSON数组,而是其他内容(比如GitLab文件的网页HTML),导致Gson无法正常解析。

错误拆解

  1. MalformedJsonException:因为拿到的不是合法JSON(比如HTML代码),Gson直接识别失败。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:46:06