翻新错误:预计BEGIN_OBJECT,但是BEGIN_ARRAY
我做了一个功能:输入身份证号码,点击提交按钮,然后获得身份证的基本信息。翻新错误:预计BEGIN_OBJECT,但是BEGIN_ARRAY
的MODEL我用:
public class IdCardInfo {
private int errNum;
private String retMsg;
private RetDataBean retData;
public int getErrNum() {
return errNum;
}
public void setErrNum(int errNum) {
this.errNum = errNum;
}
public String getRetMsg() {
return retMsg;
}
public void setRetMsg(String retMsg) {
this.retMsg = retMsg;
}
public RetDataBean getRetData() {
return retData;
}
public void setRetData(RetDataBean retData) {
this.retData = retData;
}
public static class RetDataBean {
private String sex;
private String birthday;
private String address;
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
}
改造界面我用:
@GET("apistore/idservice/id")
Observable<IdCardInfo> getIdCardInfo(@Query("id") String id);
当我输入正确的身份证号码,一切正常。返回结果为:
{
"errNum": 0,
"retMsg": "success",
"retData": {
"sex": "M",
"birthday": "1987-04-20",
"address": "some place"
}
}
一切正常。
然而,当我输入一个不正确的身份证号码,不好的事情发生了:
Caused by: java.lang.IllegalStateException:
Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 86 path $.retData
返回的结果是:
{
"errNum": -1,
"retMsg": "Incorrect ID card number!",
"retData": [ ]
}
我怎么会修正错误?
这是与没有数据的情况下服务器的问题它最有可能返回空数组,您的服务器API基于一些PHP框架。
它只能从后端排序而不是从app排序,因为不能在不改变类结构的情况下解析Array而不是Object。
所以问你的后端团队是否有可能改变这个事情,即。应将空数组置空对象或不发送关键字。
可能的黑客在这种情况下:
是的,我知道确切的问题,它不能很容易,因为它是在框架层面改变。我建议你可以改变你的代码像 这
@GET("apistore/idservice/id")
Observable<JsonObject> getIdCardInfo(@Query("id") String id);
所以在此之后,你需要分析你的代码手动,那么你需要把try-catch块特定的键解析。 即。在try块中,您将尝试将数据解析为对象,如果面临异常,则只需将null分配给该对象值。
api @ apistore/idservice/id正在返回一个空的json数组而不是一个空的json对象。你期待在这里有一个json对象,所以它会抛出。你能控制API返回的内容吗?请返回
{
"errNum": -1,
"retMsg": "Incorrect ID card number!",
"retData": { }
}
在回复中。
@singdhu我很抱歉地说:我无法控制API返回的内容。 – Sawyer
你应该使用响应的名单时,你比如返回数组 :到位
@GET("apistore/idservice/id")
Observable<List<IdCardInfo>> getIdCardInfo(@Query("id") String id);
的
@GET("apistore/idservice/id")
Observable<IdCardInfo> getIdCardInfo(@Query("id") String id);
在改造通话同时更换
Call<List<IdCardInfo>> call = service.getIdCardInfo("query");
call.enqueue(new Callback<List<IdCardInfo>>() {
@Override
public void onResponse(Call<List<IdCardInfo>> variant, Response<List<IdCardInfo>> response) {
if (response != null && response.isSuccessful() && response.errorBody() == null) {
}
}
@Override
public void onFailure(Call<List<IdCardInfo>> variant, Throwable t) {
t.printStackTrace();
}
});
显示您的请求代码 –