我必须使用一个使用 JSend 的 API格式。
长话短说,它使用 HTTP 状态代码来指示如下状态:
- 200 是成功
- 406 未授权
这很好,因为我可以由此确定我的 API 请求是否成功。
但是:
由于 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,它会变成这样。
最佳答案
这是我的 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
中获取数据输入 put Post
代替 T
.如果你想得到ArrayList<Post>
放 ArrayList<Post>
.
如果data
您的 api 响应中的字段为空或 null,Response.data
将为 null 或空,它不会抛出异常。
当你从 api 得到响应时,首先检查 Response.status
是否“成功”。如果“成功”,则从 Response
获取数据,如果不是,请采取您的错误操作。
关于android - 使用 JSend 格式通过 Retrofit 将 JSON 响应转换为 POJO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42527551/