Search code examples
androidjsonretrofit2jsonschema2pojo

How to Handle Two Different Response in Retrofit


I followed this to POST Data Using Retrofit2

I Used JSON POJO to Parse my POST and GET files

So Here If Data inside the Records Is there I will get This Kind of Response

{
"status": "200",
"response": [{
        "cnt_id": "201",
        "phn_no": "3251151515",
        "dat_cnt": "Reset Password request Said to Mail"
    },
    {
        "cnt_id": "209",
        "phn_no": "555465484684",
        "dat_cnt": "Hi DEMO User , Congratulations! Your account has been created successfully."
    },
    {
        "cnt_id": "210",
        "phn_no": "4774748",
        "dat_cnt": "Hi XYZ , Congratulations! Your account has been created successfully."
    }
]
}

If there is no Data I will get

{"status":"204","response":{"msg":"No Content"}} or
{"status":"400","response":{"msg":"BadRequest"}} or
{"status":"401","response":{"msg":"Unauthorized User"}}

So Here I can eable to Parse the data which is there in the status 200 but when Status is not equals to 200 I want to Handle them

I tried with

   status = response.body().getStatus();
   if(status.equals("200")) {
      List<Response> resList =  response.body(). getResponse();

            for(int i = 0; i<resList.size(); i++)
            {.
             .
              ..
             .
            }
        }

        else {
             //not Implemented
             }

now what should I write in Else I used response data in POJO which are not equals to 200 but I its asking for list

Update

com.example.Example.java

public class Example {
    @SerializedName("status") @Expose private String status;
    @SerializedName("response") @Expose private List<Response> response = null;
}        

com.example.Response.java

public class Response {
    @SerializedName("cnt_id") @Expose private String cntId;
    @SerializedName("phn_no") @Expose private String phnNo;
    @SerializedName("dat_cnt") @Expose private String datCnt;
}

Solution

  • public class Example {
        @SerializedName("status") @Expose private String status;
        @SerializedName("response") @Expose private Object response = null;
    }
    
    public class Response {
        @SerializedName("cnt_id") @Expose private String cntId;
        @SerializedName("phn_no") @Expose private String phnNo;
        @SerializedName("dat_cnt") @Expose private String datCnt;
    }
    
    public class ResponseError{
        @SerializedName("msg") @Expose private String msg;
    }
    

    And Your callBack methods should be like

    new Callback<Example>() {
        @Override
        public void onResponse(Call<Example> call, Response<Example> response) {
           if (response.isSuccessful()){
              Example example = response.body();
              Gson gson = new GsonBuilder().create();
    
              if (example.status.equals("200")) {
                  TypeToken<List<Response>> responseTypeToken = new TypeToken<List<Response>>() {};
                  List<Response> responseList = gson.fromJson(gson.toJson(example.getResponse()), responseTypeToken.getType());
              } else {
                  //If for everyOther Status the response is Object of ResponseError which contains msg.
                  ResponseError responseError = gson.fromJson(gson.toJson(example.getResponse()), ResponseError.class);
              }
           }
        }
        
        @Override
        public void onFailure(Call<Example> call, Throwable t) {
            //Failure message
        }
    }