【问题标题】:Does Retrofit support keypath on json parsing or something alike?Retrofit 是否支持 json 解析或类似的键路径?
【发布时间】:2016-01-27 15:07:22
【问题描述】:

例如我的 json 看起来像:

{
    "data": [
        {
            "name": "one"
        },
        {
            "name": "two"
        }
    ]
}

例如,我有带有字段名称的对象用户。

是否有可能将数据数组解析为对象用户的写入方法?

类似

Call<List<User>> getUsers(@KeyPath("data"))

现在要做到这一点,我需要创建一个类似的包装类

public class UsersWrapper {
    @SerializeName("data")
    public ArrayList<User> users;
}

接下来我在服务中

public interface Service {
    @GET("users")
    Call<UsersWrapper> getUsers()
}

但我所有的请求只是响应数据而不是数组中的变量对象。

在这种情况下,我需要为任何数据请求创建包装器。痛:(

?

【问题讨论】:

  • 我不明白这个问题。您的响应对象应该是 User 的数组
  • 我倾向于通过让调用返回JsonObject 来解决这个问题,然后将调用链接到使用gson 实例从JsonObject 获取列表的转换器中。然后我会追踪 API 编写器,直到他们更改它。

标签: android json retrofit retrofit2


【解决方案1】:

我会这样做:

全局类Wrapper&lt;T&gt;解析整个JSON

public class Wrapper<T> {
    public List<T> data;
}

User 解析实际数组;

public class User {
    public String name;
}

然后,API接口:

@GET("/people")
Wrapper<User> getUsers();

DataSource 类中,只需执行以下操作:

@Override
public List<User> getUsers() {
    Wrapper<User> usersWrapper = myApiInterface.getUsers();
    return usersWrapper.data;
}

更新1:
另一种解决方案是为List&lt;User&gt; 类型创建自定义JsonDeserializer(如here 所述),通过registerTypeAdapter 使用您的自定义Gson 对象注册它,然后您可以将您的Json 直接反序列化为List&lt;User&gt;。不过,这个解决方案带来了更多额外的代码,而且我还不清楚潜在的好处。

【讨论】:

  • 那行得通。如果您的响应都使用相同的 data 密钥,您还可以将其概括为对 class Wrapper&lt;T&gt; { public List&lt;T&gt; data; } 的多个 API 调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-08
  • 2016-02-14
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
相关资源
最近更新 更多