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:移动端适配(无需修改后端逻辑)
调整移动端代码适配后端默认返回的数字类型结果,修改步骤如下:
- 修改API接口定义,将回调泛型从
AC_Daily_Line改为Integer(如果需要获取删除行数)或者Void(不需要获取返回值):
// 调整后的接口定义,以Integer为例 @DELETE("/api/AC_Daily_Line/{id}") public void deleteEmpById(@Path("id") Integer id,Callback<Integer> callback);
- 同步修改调用处的回调逻辑:
@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
相关产品推荐
相关产品推荐

