Retrofit 是否支持 json 解析或类似的键路径?
Does Retrofit support keypath on json parsing or something alike?
例如我有 json 看起来像:
{
"data": [
{
"name": "one"
},
{
"name": "two"
}
]
}
例如我有带有字段名称的对象用户。
是否可以编写将数据数组解析为对象 User 的方法?
类似于
Call<List<User>> getUsers(@KeyPath("data"))
现在要做到这一点,我需要创建一个包装器 class 类似
public class UsersWrapper {
@SerializeName("data")
public ArrayList<User> users;
}
接下来我将在服役中
public interface Service {
@GET("users")
Call<UsersWrapper> getUsers()
}
但我所有的请求都只是响应数据,而不是数组中的变量对象。
在这种情况下,我需要为任何数据请求创建包装器。痛苦:(
?
我会这样做:
全局classWrapper<T>
解析整个JSON
public class Wrapper<T> {
public List<T> data;
}
和User
解析实际数组;
public class User {
public String name;
}
然后,API界面:
@GET("/people")
Wrapper<User> getUsers();
然后在 DataSource
class 中做这样的事情:
@Override
public List<User> getUsers() {
Wrapper<User> usersWrapper = myApiInterface.getUsers();
return usersWrapper.data;
}
Upd1:
另一种解决方案是为 List<User>
类型创建自定义 JsonDeserializer
(如描述的 here),通过 registerTypeAdapter
将其注册到您的自定义 Gson
对象,然后您可以反序列化你的 Json 直接变成 List<User>
。不过,此解决方案带来了更多的额外代码,潜在的好处对我来说还不清楚。
例如我有 json 看起来像:
{
"data": [
{
"name": "one"
},
{
"name": "two"
}
]
}
例如我有带有字段名称的对象用户。
是否可以编写将数据数组解析为对象 User 的方法?
类似于
Call<List<User>> getUsers(@KeyPath("data"))
现在要做到这一点,我需要创建一个包装器 class 类似
public class UsersWrapper {
@SerializeName("data")
public ArrayList<User> users;
}
接下来我将在服役中
public interface Service {
@GET("users")
Call<UsersWrapper> getUsers()
}
但我所有的请求都只是响应数据,而不是数组中的变量对象。
在这种情况下,我需要为任何数据请求创建包装器。痛苦:(
?
我会这样做:
全局classWrapper<T>
解析整个JSON
public class Wrapper<T> {
public List<T> data;
}
和User
解析实际数组;
public class User {
public String name;
}
然后,API界面:
@GET("/people")
Wrapper<User> getUsers();
然后在 DataSource
class 中做这样的事情:
@Override
public List<User> getUsers() {
Wrapper<User> usersWrapper = myApiInterface.getUsers();
return usersWrapper.data;
}
Upd1:
另一种解决方案是为 List<User>
类型创建自定义 JsonDeserializer
(如描述的 here),通过 registerTypeAdapter
将其注册到您的自定义 Gson
对象,然后您可以反序列化你的 Json 直接变成 List<User>
。不过,此解决方案带来了更多的额外代码,潜在的好处对我来说还不清楚。