2017-11-11 314 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}}] 

这是一个数组

相关问题