使用JSend格式使用Retrofit将JSON响应转换为POJO?

时间:2017-03-01 09:10:12

标签: android json parsing retrofit jsend

我必须使用使用JSend格式的API。

长话短说,它使用的是HTTP状态代码,表示状态如下:

  • 200是成功
  • 406未经授权

哪个好,因为我可以从中确定我的API请求是否成功。

BUT:

由于JSend格式有它自己的东西,它在响应时也有一个小状态指示器,如下所示:

{
    status : "success",
    data : { "post" : { "id" : 2, "title" : "Another blog post", "body" : "More content" }}
}

因此它具有“#”状态'此字段还显示API请求是否成功。

问题:

用于解析对POJO的响应的改造,因此它假定响应仅包含模型而没有成功的指标,例如:(模型后实例)

{ "id" : 2, "title" : "Another blog post", "body" : "More content" }

我的问题是:

有解决方案吗? 我可以预先解析状态指示器,拆分数据' (模型)响应的一部分并将其改为仅解析该部分?

如果不是,我将不得不添加"状态"属于我的每个模特,这显然不是一个适合步行的方式,我不会那样做。

我是否应该坚持手动解析并使用ResponseBody代替我的模型

对于void onResponse(Call<T> call, Response<T> response);类型参数,

T

因为这样我可以使用.string()并将字符串转换为JSON,之后我可以手动解析我的模型,就像为它们编写解析器一样。

我真的想使用Retrofit的功能进行自动解析,因为使用JSend我无法想象无论如何都可以做到这一点。

我不能改变它会成为这样的API。

3 个答案:

答案 0 :(得分:4)

这是我的Response课程。

public class Response<T> implements Serializable {
private T data;
private String status;

public T getData() {
    return data;
}

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

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

}

这是我的api电话。

Callback<com.shippn.api.models.Response<T>> callback = new Callback<com.shippn.api.models.Response<T>>() {
        @Override
        public void onResponse(Call<com.shippn.api.models.Response<T>> call, Response<com.shippn.api.models.Response<T>> response) {
            checkStatus(response.body());
        }

        @Override
        public void onFailure(Call<com.shippn.api.models.Response<T>> call, Throwable t) {
            fail();
        }
    };
    call.enqueue(callback);

T参数是来自api的数据类型。我的意思是,如果您想要Post类型Post T的{​​{1}}类型的数据。如果您想ArrayList<Post>ArrayList<Post>

如果您的api响应中data字段为空或为空,Response.data将为空或空,它不会引发异常。

当您从api收到回复时,首先检查Response.status是否“成功”。如果它是“成功”,则从Response获取数据,如果它没有采取您的错误操作。

答案 1 :(得分:0)

您可以做的是您可以拥有帖子请求的状态而不使用它。 问题是参数名称不是字符串,不会在POJO中解析。但是你可以像这样获得你的请求状态。

@Override
            public void onResponse(Call<Object> call, retrofit2.Response<Object> response) {
                alertDialog.dismiss();
                if (response.isSuccessful() && response.body() != null) {
                    //if the response is received here it means it was success
                }else if(response.errorBody()!=null){
                    //if the response is received here it means it was error
                }
            }

            @Override
            public void onFailure(Call<Object> call, Throwable t) {
                //if the response is received here it means it was failure
                t.printStackTrace();
            }
        });

修改 通过这种方式,您可以使用pojo获得状态,并且可以像在link

中一样解析错误

编辑1 此外,为了获得正确的错误代码,您可以将回调类扩展为类似

的类
public class ErrorValues {
    public int code=0;
    public String error;
}

然后,如果请求已完成并出现错误。内部

else if(response.errorBody()!=null){
 int error=response.body.code == 404 ....
                    }

像这样你可以检查请求抛出了哪个错误代码。

答案 2 :(得分:0)

一种可能的方法是为模型创建一个包装器,如

public class Example<T> {
    String status;
    T data;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public T getData() {
        return data;
    }

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