改装错误:预计BEGIN_OBJECT但是BEGIN_ARRAY

时间:2017-01-02 08:47:55

标签: android gson retrofit rx-java

我做了一个功能:输入身份证号码,点击提交按钮,然后获取身份证的基本信息。

我使用的模型:

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": [ ]
}

我该如何修复错误?

3 个答案:

答案 0 :(得分:2)

api @ apistore / idservice / id返回一个空的json数组而不是一个空的json对象。你在这里期待一个json对象,所以它会抛出。您是否可以控制API返回的内容?请返回

{
    "errNum": -1, 
    "retMsg": "Incorrect ID card number!", 
    "retData": { }
}

在回复中。

答案 1 :(得分:1)

这是服务器的问题,如果没有数据它返回空数组,你的服务器API很可能基于一些PHP框架。

它只能从后端排序,而不能从app中排序,因为你无法在不改变类结构的情况下解析Array而不是object。

所以问你的后端团队是否有可能改变那个东西,即。空数组为null对象或不应发送任何键。

在这种情况下可能发生黑客行为:

是的,我知道确切的问题,因为它处于框架级别,因此无法轻易更改。我建议你可以改变你的代码 这个

@GET("apistore/idservice/id")
Observable<JsonObject> getIdCardInfo(@Query("id") String id);

所以在此之后你需要手动解析你的代码然后你需要把那个特定的键解析放在try-catch块中。 在try块中,如果面部异常,则会尝试将数据解析为对象,然后将null赋予该对象值。

答案 2 :(得分:0)

返回数组时应该使用List of response 例如:

@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();

            }
        });