2017-01-02 239 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(); 

      } 
     }); 
相關問題