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

Retrofit出现JsonSyntaxException: Expected BEGIN_OBJECT but was NUMBER如何解决

报错排查与解决方案

报错根因

  • 报错retrofit.RetrofitError: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was NUMBER at line 1 column 5的核心含义是:Gson在反序列化接口返回值时,期望收到JSON对象(以{开头),但实际返回的是数字类型的值。
  • 你当前代码中API接口的回调泛型指定为AC_Daily_Line,要求Retrofit将返回结果解析为对应类对象,但绝大多数后端的DELETE接口默认返回被删除的行数(数字,例如1代表成功删除1条数据),而非被删除的业务对象,因此触发类型不匹配的解析异常。

注意:如果确认后端接口逻辑是返回被删除的考勤对象,建议使用抓包工具查看接口实际返回值,排查是否出现后端逻辑异常返回了数字。

解决方案

提供两种可选适配方案:

方案1:后端适配(无需修改移动端代码)

要求后端调整DELETE接口的返回逻辑,删除成功后返回被删除的AC_Daily_Line对象即可,你当前的移动端代码无需做任何修改。

方案2:移动端适配(无需修改后端逻辑)

调整移动端代码适配后端默认返回的数字类型结果,修改步骤如下:

  1. 修改API接口定义,将回调泛型从AC_Daily_Line改为Integer(如果需要获取删除行数)或者Void(不需要获取返回值):
// 调整后的接口定义,以Integer为例
@DELETE("/api/AC_Daily_Line/{id}")
public void deleteEmpById(@Path("id") Integer id,Callback<Integer> callback);
  1. 同步修改调用处的回调逻辑:
@Override
public void onClick(View v) {
    if (findViewById(R.id.btnDelete)==v){
        restService.getService().deleteEmpById(_Student_Id, new Callback<Integer>() {
            @Override
            public void success(Integer deleteCount, Response response) {
                // deleteCount为被删除的行数,大于0即代表删除成功
                Toast.makeText(AttendanceDelete.this, "Employee Record Deleted", Toast.LENGTH_LONG).show();
            }

            @Override
            public void failure(RetrofitError error) {
                Toast.makeText(AttendanceDelete.this, error.getMessage(), Toast.LENGTH_LONG).show();
            }
        });
    }
}

内容的提问来源于stack exchange,提问作者Nurul Nabila Mahadi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:27:04