Android应用获取用户资料时JSON解析异常求助
问题排查方案
针对你遇到的EOFException和JsonSyntaxException,分以下步骤排查:
一、先解决EOFException(输入在第1行第1列结束)
这个错误说明请求没有拿到合法的JSON响应,甚至响应为空,优先排查以下点:
- 后端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; }
- 检查PHP代码是否在token验证失败时,仅执行
- 直接用Postman/浏览器调用接口,带上正确的token,看是否返回合法JSON。如果返回为空:
- 前端请求配置验证
- 确认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。
- 确认Retrofit添加了Gson转换器:
二、解决JsonSyntaxException(期望BEGIN_OBJECT却得到BEGIN_ARRAY)
这个错误是后端返回的JSON结构和前端数据类不匹配,核心是确认后端返回的是对象还是数组,再对应调整数据类:
- 抓包确认后端返回的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:
同时ApiService返回类型改成data class BaseResponse<T>( val code: Int, val msg: String, val data: T ) data class ResponseInfoUser( val id: Int, val username: String )Call<BaseResponse<ResponseInfoUser>>。
- 如果返回的是数组:
- 数据类字段匹配验证
检查ResponseInfoUser的字段名是否和后端JSON的key完全一致,比如后端是user_name,前端是username,需添加@SerializedName注解:data class ResponseInfoUser( @SerializedName("user_name") val username: String, val id: Int ) - Gson配置优化
给Gson添加宽松解析规则,避免因JSON格式小问题导致解析失败:
然后用这个实例创建Retrofit的Gson转换器。val gson = GsonBuilder() .setLenient() .create()
三、最后验证流程
- 用Postman调用接口,复制返回的JSON,用Android Studio的
GsonFormat插件自动生成对应的数据类,确保结构100%匹配。 - 在ViewModel/Repository中添加异常捕获,打印完整错误信息,方便定位:
viewModelScope.launch { try { val response = repository.getUserInfo(token) // 处理响应 } catch (e: Exception) { Log.e("UserInfoError", e.stackTraceToString()) } }
内容的提问来源于stack exchange,提问作者Noah
相关产品推荐
相关产品推荐

