I have a strict API that will give me different JSON depending if the request is correct or not. I can have 2 differents JSON for one same request. The status of the request will ALWAYS be 200 (if it's an error or a success) so I cannot use the status of the request
Error response : 
{
    "stError": {
        "azType": "Application",
        "azCode": "Bad value parameter - azPassword is empty"
    }
}
Success response : 
{
     "azToken": "qsdsqd",   #1 And this field can be inexistant if the bLogin is 0
     "bLogin" : 1
}
So I created the POJO that I needed :
public class LoginAPIResponse {
    @SerializedName("azToken")
    @Expose
    private String azToken;
    @SerializedName("bLogin")
    @Expose
    private Boolean bLogin;
    ### Setters and getters stuff ###
}
public class LOLError {
    @SerializedName("stError")
    @Expose
    private stError stError;
    ### Setters and getters stuff ###
}
public class stError {
    @SerializedName("azType")
    @Expose
    private String azType;
    @SerializedName("azCode")
    @Expose
    private String azCode;
    ### Setters and getters stuff ###
}
And of course I have my service that I need when I create my webService
public interface LoginService {
    /***
     * @POST declares an HTTP POST Request
     * This request is use when a user needs to login with his credentials
     */
    @POST("JCExecDev/JCOSSUserLogin")
    Call<LOLError> login(@Body LoginAPIRequest request);
}
And here is my login function in my repository :
Call</*[DynamicResponse?]*/> call = loginService.login(request);
call.enqueue(new Callback</*[DynamicResponse?]*/>() {
    @Override
    public void onResponse(Call</*[DynamicResponse?]*/> call, Response<LOLError> response) {
    call.enqueue(new Callback</*[DynamicResponse?]*/>() {
        @Override
        public void onResponse(Call</*[DynamicResponse?]*/> call, Response<LOLError> response) {
           // Manage to find the way to get either LOLError or LoginAPIResponse
        }
        @Override
        public void onFailure(Call</*[DynamicResponse?]*/> call, Throwable t) {
        #Failure from the server, we do not take this in consideration
}
});
I am using retrofit 2 with GSON Deserialisation.
And here is my questions :
- Can I dynamically load the right response with only retrofit (or find a way to have it in a DynamicResponse as I put it in the exemple)?
- If not, would it be better to manager it with a custom deserializer ?
- If I am using a custom deserializer, is their a way to use it so it can always return me the error if there is some errors (Maybe with templates ?)
- Is there an easy way to do this by getting the raw data in my response and then deserialize it by hand ?
- Finally, how can I manage the fact that some fields from my response may be inexistant like the token when the credentials aren't correct. For exemple, for a success response, I can either avec [bLogin : 0] or [azToken: "myToken", bLogin : 1] depending if the password is correct.
I CAN'T change the procedures, that means that I can't change my response and add a common field to the error and the success.
