2017-01-02 7 views
2

IDカード番号を入力して送信ボタンをクリックし、IDカードの基本情報を取得しました。改造エラー:BEGIN_OBJECTがBEGIN_ARRAYになっていましたが、BEGIN_ARRAYでした

私が使用したモデル:

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

I入力、正しいIDカード番号に、すべてがうまく動作します。返される結果は次のとおりです。

{ 
    "errNum": 0, 
    "retMsg": "success", 
    "retData": { 
     "sex": "M", 
     "birthday": "1987-04-20", 
     "address": "some place" 
    } 
} 

すべてがうまくいきます。

しかしときI入力間違ったIDカード番号、悪いことが起こる:

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フレームワークに基づいています。

クラス構造を変更することなく、オブジェクトの代わりに配列を解析できないため、アプリケーションからではなくバックエンドからのみソートできます。

バックエンドチームにそのことを変更することができるかどうかを質問してください。空の配列をnullオブジェクトにするか、キーを送信しないでください。このような場合に

可能ハック:

はい、私は正確な問題を知っている、それはフレームワークレベルであるので、それは容易に変更することが傾けます。私は、この後に手動でコードを解析する必要がこの

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

あなたのコードを変更することができます ような何かを示唆してどのようなあなたは、try-catchブロックで、その特定のキーの解析を配置する必要があります。すなわち、 ie。 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<IdCardInfo> getIdCardInfo(@Query("id") String id); 

の代わりに

@GET("apistore/idservice/id") 
Observable<List<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(); 

      } 
     }); 
関連する問題