2017-01-02 141 views
2

我做了一个功能:输入身份证号码,点击提交按钮,然后获得身份证的基本信息。翻新错误:预计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": [ ] 
} 

我怎么会修正错误?

+0

显示您的请求代码 –

回答

1

这是与没有数据的情况下服务器的问题它最有可能返回空数组,您的服务器API基于一些PHP框架。

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

所以问你的后端团队是否有可能改变这个事情,即。应将空数组置空对象或不发送关键字。

可能的黑客在这种情况下:

是的,我知道确切的问题,它不能很容易,因为它是在框架层面改变。我建议你可以改变你的代码像 这

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

所以在此之后,你需要分析你的代码手动,那么你需要把try-catch块特定的键解析。 即。在try块中,您将尝试将数据解析为对象,如果面临异常,则只需将null分配给该对象值。

+0

感谢您的建议,但可惜的是,服务器API是一个通用API,其返回无法更改。所以问题出来了。 – Sawyer

+0

非常感谢。我从你的答案中得到了很多。 – Sawyer

2

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

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

在回复中。

+0

@singdhu我很抱歉地说:我无法控制API返回的内容。 – Sawyer

0

你应该使用响应的名单时,你比如返回数组 :到位

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

      } 
     }); 
相关问题