2017-11-11 16 views
0

私はこの問題を何度かstackoverflowで尋ねました。しかし、それらの回答は私の問題を修正していません。私はretrofitを使用しています。フォームurlencordedjava.lang.IllegalStateException:BEGIN_ARRAYが期待されていましたが、BEGIN_OBJECT -ANDROID RETROFIT2でした

Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(AllConstants.BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 


    public void getUser(String username,String password){ 

     WebserviceAPI apiService =retrofit.create(WebserviceAPI.class); 
     Call<UserResponse> call = apiService.getUsers("signin",username,password); 
     call.enqueue(new Callback<UserResponse>() { 
      @Override 
      public void onResponse(Call<UserResponse> call, Response<UserResponse> response) { 
       UserResponse result = response.body(); 
       Log.d("res",""+result.getData()); 

      } 

      @Override 
      public void onFailure(Call<UserResponse> call, Throwable t) { 
       Log.d("res",""+t.getMessage()); 

      } 
     }); 
    } 
:その後、応答は猫が java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT

要求

POSTを示すログ、私がログインしようとしてarray.when内部の2つのトークンになりますパスワード、ユーザ名を送信interface.i'mログイン

Modelクラス

public class User { 

    String id; 
    String username; 
    String email; 
    String access_token; 
    String refresh_token; 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public String getAccess_token() { 
     return access_token; 
    } 

    public void setAccess_token(String access_token) { 
     this.access_token = access_token; 
    } 

    public String getRefresh_token() { 
     return refresh_token; 
    } 

    public void setRefresh_token(String refresh_token) { 
     this.refresh_token = refresh_token; 
    } 

} 

UserResponse.java

public class UserResponse { 
    List<User> data; 

    public List<User> getData() { 
     return data; 
    } 

    public void setData(List<User> data) { 
     this.data = data; 
    } 

} 

インタフェース

public interface WebserviceAPI { 
    @FormUrlEncoded 
    @POST("auth") 
    Call<UserResponse> getUsers(@Field("module_action") String signin ,@Field("username") String username,@Field("password") String password); 
} 

サーバー側からの応答:PHP

$response = ['status' => true, 
      'message' => "Successfully logged in", 
      'data' => [ 
       'access_token' => $accessToken, 
       'refresh_token' => $refreshToken 
      ], 
      ]; 
      $this->returnJson($response, 200); 

私はポストマンで実行すると、応答は次のようである下記

enter image description here

--------更新-----------

一部の回答にはstatusmessageしか含まれていません。

応答例:

{ 
    "status": false, 
    "message": "Inactive User" 
} 

その後、私はmessageを取得したいです。あなたのポストマンレスポンスデータフィールドで

public class UserResponse { 
     @SerializedName("status") 
     @Expose 
     private String status; 

     @SerializedName("message") 
     @Expose 
     private String message; 

     User data; 

     public String getStatus() { 
      return status; 
     } 

     public void setStatus(String status) { 
      this.status = status; 
     } 

     public String getMessage() { 
      return message; 
     } 

     public void setMessage(String message) { 
      this.message = message; 
     } 

     public User getData() { 
      return data; 
     } 

     public void setData(User data) { 
      this.data = data; 
     } 

    } 

public void getUser(String username,String password){ 

     WebserviceAPI apiService =retrofit.create(WebserviceAPI.class); 
     Call<UserResponse> call = apiService.getUsers("signin",username,password); 
     call.enqueue(new Callback<UserResponse>() { 
      @Override 
      public void onResponse(Call<UserResponse> call, Response<UserResponse> response) { 
       UserResponse result = response.body(); 
       //User data = result.getData(); 
       Log.d("userresponse",""+result.getMessage()); 

      } 

      @Override 
      public void onFailure(Call<UserResponse> call, Throwable t) { 
       Log.d("res",""+t.getMessage()); 

      } 
     }); 
    } 
+0

が親切にあなたのJSON「データ」でスタックトレースやエラーログ – silverFoxA

+0

を提供している

[{"status":true,"message":"Successfully logged in","data":{"access_token":null,"refresh_token":null}}] 

ある

$response[] = array('status' => true, 'message' => "Successfully logged in", 'data' => [ 'access_token' => $accessToken, 'refresh_token' => $refreshToken ], ); echo json_encode($response); 
にサーバーコードを変更

ではありませんリストはオブジェクトです。したがって、リストのデータを削除し、ユーザーデータを使用してみてください。 –

答えて

1

java.lang.NullPointerException at com.android.app.myapp.Login$3.onResponse(Login.java:92)を示す.then私は以下のようにUserResponseを編集しmessageを取得しようとしてい

はないJSON配列として、JSONオブジェクトとして来ています。この場合、UserResponseモデルのリストとして「データ」フィールドを使用している場合、それをマップすることはできません。これは私が思う問題です。それを解決するには、UserResponseデータモデルの下に使用することができます。

public class UserResponse { 
    User data; 

    public User getData() { 
     return data; 
    } 

    public void setData(User data) { 
     this.data = data; 
    } 

} 
+0

はい、それは働いています。明確化のためにありがとう – user8164155

+0

'User data = result.getData();'を使ってデータオブジェクトを取得できます。どのように 'message'を取得できますか? – user8164155

+0

Messageという名前の文字列変数をUserResponseに追加し、ゲッターとセッターを追加します。 –

0

エラーがすべてExpected BEGIN_ARRAY but was BEGIN_OBJECT -ANDROID RETROFIT2 すなわち応答またはJSONを受け、それはあなたが配列としてそれにアクセスしようとしているオブジェクトであると言います。

予想される応答は、アレイ

関連する問題