如何为Retrofit2创建动态JSON响应解析器?

时间:2019-01-23 13:51:26

标签: java android json retrofit response

我有一个严格的API,它将根据请求是否正确为我提供不同的JSON。对于一个相同的请求,我可以使用2个不同的JSON。请求的状态始终为200(如果错误或成功),所以我无法使用请求的状态

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
}

因此,我创建了所需的 POJO

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 ###
}

当然,当我创建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);
}

这是我在存储库中的登录功能:

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

我正在使用带有GSON反序列化的改造2。

这是我的问题:

  • 我是否可以仅通过改造来动态加载正确的响应(或者像我将其放在示例中那样找到在DynamicResponse中获得响应的方法)?
  • 如果不是,最好使用自定义解串器对其进行管理?
  • 如果我使用的是自定义反序列化器,那么他们是否可以使用它,因此如果出现某些错误(也许有模板?),它总是可以向我返回错误信息
  • 是否有一种简单的方法可以通过在响应中获取原始数据,然后手动对数据进行反序列化呢?
  • 最后,当凭证不正确时,如何处理响应中的某些字段可能像令牌一样不存在的事实。例如,对于成功的响应,我可以使用avec [bLogin:0]或[azToken:“ myToken”,bLogin:1]来确定密码是否正确。

我无法更改程序,这意味着我无法更改响应,也无法为错误和成功添加公用字段。

0 个答案:

没有答案