2016-08-16 8 views
1

Я использовал retrofit 2 для проекта, и я не могу разобрать ответ json.Ожидаемое BEGIN_ARRAY, но было BEGIN_OBJECT в модификации 2?

Retrofit retrofit = new Retrofit.Builder().baseUrl("BASE_URL").addConverterFactory(GsonConverterFactory .create()).build(); 
final RetrofitApi request = retrofit.create(RetrofitApi.class); 
LoginModel loginModel = new LoginModel("[email protected]",[email protected]#"); 
Call<List<LoginResponse>> listCall = request.Loginner(loginModel); 
listCall.enqueue(new Callback<List<LoginResponse>>() { 
     @Override 
     public void onResponse(Call<List<LoginResponse>> call, Response<List<LoginResponse>> response) { 
      List<LoginResponse> loginModelList = new ArrayList<>(); 
      loginModelList = response.body(); 

Ответ был как JSON

{ 
     "response": { 
     "errorCode": "", 
     "errorMsg": "", 
     "successCode": "SUB001", 
     "successMsg": "Login successfully", 
     "data": { 
      "user_details": { 
      "salutation": "Mr.", 
      "first_name": "User", 
      "last_name": "R", 
      "email": "[email protected]", 
      "alternative_email": "", 
      "mobile_number": "54312", 
      "phone_number": "", 
      "title_position": "", 
      "department": "", 
      "city": "", 
      "street": "", 
      "state": "", 
      "postcode": "", 
      "display_name": "Bijoy R", 
      "assistant_details": "", 
      "country_name": "India", 
      "institution_name": "KLO", 
      "user_type": "commercial" 
      }, 
      "payment_details": [ 
      { 
       "dateandtime": "28-07-2016 17:4736", 
       "payment_mode": "DD", 
       "items": "Accompanying Person", 
       "transactionId": "", 
       "amount": "3000.00", 
       "status": "Failed" }  ], 
     } 
     } 
    } 

Как написать методы получения и установки для этого типа JSON.

+0

пожалуйста, показать 'LoginResponse' класс –

+0

вы получите ваш JSON ответ из бревен? ваш класс pojo выглядит нормально. вам нужно убедиться, что 'payment_details' на самом деле является массивом в ответ от сервера. –

+0

ya Я получаю ответ успешно, но не могу его разобрать, потому что дооснащение показывает, что BEGIN_ARRAY, но было .. –

ответ

4

Попробуйте заменить Call<List<LoginResponse>> с Call<LoginResponse> и Response<List<LoginResponse>> к Response<LoginResponse>

+0

Это работает, весь мой класс модели сгенерирован с использованием плагина DTO. Спасибо брат! :) –

0

изменить возвращение типа дооснащения API Интерфейс Call<ServerResponse<LoginResponse>>, fllow этот код:

public class ServerResponse<T> { 

    private ResponseStatus response; 
    private T data; 

    public ResponseStatus getResponse() { 
     return response; 
    } 

    public void setResponse(ResponseStatus response) { 
     this.response = response; 
    } 

    public T getData() { 
     return data; 
    } 

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

public class ResponseStatus { 

    private String errorCode; 
    private String errorMsg; 
    private String successCode; 
    private String successMsg; 

    public String getErrorCode() { 
     return errorCode; 
    } 

    public void setErrorCode(String errorCode) { 
     this.errorCode = errorCode; 
    } 

    public String getErrorMsg() { 
     return errorMsg; 
    } 

    public void setErrorMsg(String errorMsg) { 
     this.errorMsg = errorMsg; 
    } 

    public String getSuccessCode() { 
     return successCode; 
    } 

    public void setSuccessCode(String successCode) { 
     this.successCode = successCode; 
    } 

    public String getSuccessMsg() { 
     return successMsg; 
    } 

    public void setSuccessMsg(String successMsg) { 
     this.successMsg = successMsg; 
    } 
} 

public class LoginResponse { 

    @SerializedName("userDetails") 
    private User userDetails; 

    @SerializedName("payment_details") 
    private List<PaymentDetail> paymentDetails; 

    public User getUserDetails() { 
     return userDetails; 
    } 

    public void setUserDetails(User userDetails) { 
     this.userDetails = userDetails; 
    } 

    public List<PaymentDetail> getPaymentDetails() { 
     return paymentDetails; 
    } 

    public void setPaymentDetails(List<PaymentDetail> paymentDetails) { 
     this.paymentDetails = paymentDetails; 
    } 
} 

public class User { 
    /** 
    * Ignore implement 
    */ 
} 

public class PaymentDetail { 
    /** 
    * Ignore implement 
    */ 
} 

использовать приведенный выше пример, чтобы написать свой класс модели, связанные с форматом ответа JSON. Я рекомендую ваш ответ JSON использовать стиль CamelCase, лучше сочетаться с GSON. Прошу прощения, мой английский настолько ограничен.

Смежные вопросы