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

Android应用获取用户资料时JSON解析异常求助

问题排查方案

针对你遇到的EOFException和JsonSyntaxException,分以下步骤排查:

一、先解决EOFException(输入在第1行第1列结束)

这个错误说明请求没有拿到合法的JSON响应,甚至响应为空,优先排查以下点:

  1. 后端PHP接口输出验证
    • 直接用Postman/浏览器调用接口,带上正确的token,看是否返回合法JSON。如果返回为空:
      • 检查PHP代码是否在token验证失败时,仅执行die()或exit()却未输出任何内容,需改成输出标准错误JSON,比如echo json_encode(['code'=>401,'msg'=>'token无效']);。
      • 开启PHP错误提示(error_reporting(E_ALL); ini_set('display_errors', 1);),排查是否有语法错误导致代码中途中断,无法输出JSON。
      • 检查json_encode是否成功:PHP中如果数据存在循环引用或非法格式,json_encode会返回false,此时需用json_last_error_msg()查看编码错误,比如:
        $json = json_encode($userData);
        if($json === false) {
            echo json_encode(['code'=>500, 'msg'=>json_last_error_msg()]);
        } else {
            echo $json;
        }
        
  2. 前端请求配置验证
    • 确认Retrofit添加了Gson转换器:addConverterFactory(GsonConverterFactory.create()),没有转换器会导致无法解析响应。
    • 检查请求头的token是否正确携带:比如通过@Header("Authorization")传参,或全局Interceptor添加,用Retrofit日志拦截器查看实际请求头:
      val loggingInterceptor = HttpLoggingInterceptor().apply {
          level = HttpLoggingInterceptor.Level.BODY
      }
      val okHttpClient = OkHttpClient.Builder().addInterceptor(loggingInterceptor).build()
      
    • 确认请求方法与后端一致:比如后端是GET,ApiService注解不能用@POST。

二、解决JsonSyntaxException(期望BEGIN_OBJECT却得到BEGIN_ARRAY)

这个错误是后端返回的JSON结构和前端数据类不匹配,核心是确认后端返回的是对象还是数组,再对应调整数据类:

  1. 抓包确认后端返回的JSON格式
    用Android Studio的Network Inspector或抓包工具,拿到真实响应内容,比如:
    • 如果返回的是数组:[{"id":1,"username":"test"}],但你的ResponseInfoUser定义的是单个对象,需把ApiService的返回类型改成Call<List<ResponseInfoUser>>或Flow<List<ResponseInfoUser>>。
    • 如果返回的是带包裹的对象:{"code":200,"msg":"success","data":{"id":1,"username":"test"}},需定义基础响应类包裹ResponseInfoUser:
      data class BaseResponse<T>(
          val code: Int,
          val msg: String,
          val data: T
      )
      data class ResponseInfoUser(
          val id: Int,
          val username: String
      )
      
      同时ApiService返回类型改成Call<BaseResponse<ResponseInfoUser>>。
  2. 数据类字段匹配验证
    检查ResponseInfoUser的字段名是否和后端JSON的key完全一致,比如后端是user_name,前端是username,需添加@SerializedName注解:
    data class ResponseInfoUser(
        @SerializedName("user_name")
        val username: String,
        val id: Int
    )
    
  3. Gson配置优化
    给Gson添加宽松解析规则,避免因JSON格式小问题导致解析失败:
    val gson = GsonBuilder()
        .setLenient()
        .create()
    
    然后用这个实例创建Retrofit的Gson转换器。

三、最后验证流程

  1. 用Postman调用接口,复制返回的JSON,用Android Studio的GsonFormat插件自动生成对应的数据类,确保结构100%匹配。
  2. 在ViewModel/Repository中添加异常捕获,打印完整错误信息,方便定位:
    viewModelScope.launch {
        try {
            val response = repository.getUserInfo(token)
            // 处理响应
        } catch (e: Exception) {
            Log.e("UserInfoError", e.stackTraceToString())
        }
    }
    

内容的提问来源于stack exchange,提问作者Noah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:42:46