android - Retrofit 是否支持 json 解析或类似的键路径?

标签 android json retrofit retrofit2

例如我有 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()
}

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

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

?

最佳答案

我会这样做:

全局类 Wrapper<T>解析整个 JSON

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

User解析实际数组;

public class User {
    public String name;
}

然后,API接口(interface):

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

并且在 DataSource类只是做这样的事情:

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

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

关于android - Retrofit 是否支持 json 解析或类似的键路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35040924/

相关文章:

android - ROOM迁移过程中如何处理索引信息

Android SIM卡更改

java - jackson.databind.ObjectMapper upperCasing json 数组和对象名称

Java Retrofit 多请求单响应

android - 如何以编程方式在谷歌地图中显示特定位置?

Android View 阴影

Java 对象的 fromString 方法?

php - 如何从其他网站获取信息

java - 改造GSON响应抽象映射

android - Retrofit + RxJava 链接多个请求并聚合结果