android - 使用 JSend 格式通过 Retrofit 将 JSON 响应转换为 POJO?

标签 android json parsing retrofit jsend

我必须使用一个使用 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/

相关文章:

android - Android:如何像YouTube一样创建ScrollView?

python - django 的 Json 响应列表

json - 'String'类型不是 'int'错误的 'index'类型的子类型

java - 从一个链接而不是另一个链接抓取 JSON

Android连接BLE模块并通过串口发送数据

r - asJSON(keep_vec_names=TRUE) 的输入是一个命名向量。在未来的 jsonlite 版本中,将不支持此选项

java - Json Parse 无法正常工作,但适用于 jsontest

用于日志解析的 C++ 库

java - 从 Graql 转换为 Java API

java - 如果使用 API 的数据库发生变化,如何显示推送通知?