2017-11-11 309 views
0

我已經看到這個問題幾次在stackoverflow問。但這些答案不解決我的問題,我是新的retrofit.i'm使用改造我的登錄interface.i'm發送用戶名,密碼,然後響應將是一個array.when我試圖登錄裏面兩個記號,​​登錄貓表示java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECTjava.lang.IllegalStateException:預計BEGIN_ARRAY,但是BEGIN_OBJECT --ANDROID RETROFIT2

請求

POST:形狀urlencorded

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

      } 
     }); 
    } 

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

我已經如下編輯UserResponse並試圖獲得message。然後表示java.lang.NullPointerException at com.android.app.myapp.Login$3.onResponse(Login.java:92)

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

請提供堆棧跟蹤信息或錯誤日誌 – silverFoxA

+0

在您的JSON「數據」不一個列表是一個對象。因此請嘗試刪除列表數據並使用用戶數據。 –

回答

1

在您的郵遞員響應數據字段即將作爲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

我可以使用'用戶數據= result.getData();'.so我可以得到'消息'數據對象? – user8164155

+0

向UserResponse添加一個名爲message的字符串變量,並添加它的getter和setter –

0

錯誤說,這一切Expected BEGIN_ARRAY but was BEGIN_OBJECT -ANDROID RETROFIT2 即響應或JSON收到的是你試圖訪問它作爲一個數組對象。

更改您的服務器代碼

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

echo json_encode($response); 

期望的迴應是

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

這是一個數組

相關問題