【发布时间】:2020-11-19 18:52:47
【问题描述】:
我正在使用一个 API,其中所有数据都包装在一个自定义对象中(见下文),因此我无法使用 moshi 将改造主体直接转换为我的模型。在这种情况下,与 moshi 合作的最佳方式是什么?
#COLLECTIONS ENDPOINT
{
"status": 200,
"data": [
{
"id": 28122,
"name": "Abandonei",
"counts": {
"books": 3
}
},
{
"id": 21091,
"name": "Lendo",
"counts": {
"books": 6
}
},
],
"errors": [],
"pagination": {
"after": 2,
"hasNextPage": true
}
}
所有api端点使用相同的json结构,默认字段为:
{
"status": 200,
"data": [],
"errors": [],
"pagination": {
"after": 1,
"hasNextPage": true
}
}
我的收藏模型:
public class BookCollection {
public long id;
public String name;
public ArrayList<Book> books;
public BookCollection(long id, String name) {
this.id = id;
this.name = name;
}
}
【问题讨论】:
-
您的模型现在有什么代码?您的 moshi 适配器应该能够毫无问题地处理这些数据。
-
@RayHunter 我添加了我在此请求中使用的模型以及所有端点上 api 返回的 json 示例
-
你的 json 需要匹配你的模型。因此,您可以创建一个新的,而不是 BookCollection,让 json 数据中的所有字段都返回。
-
但是这样我需要为我的所有模型创建一个父类。我认为这不是工作的最佳做法。在 Gson 中,我可以创建一个自定义适配器,该适配器将用于解析器进程以仅获取 json 数据属性中的数据,然后使用可能的模型返回解析的数据。我知道在 Moshi 中也可以,但我不知道该怎么做。
-
没错,api 强制你用自定义的父类包装它。我不是这种 json 响应的忠实粉丝。状态和错误应该在 http 级别而不是在响应负载中处理。对于 moshi,您可以创建一个适配器来处理父级和处理数据并将 java/kotlin 对象返回给您。 Gson 也可以使用自定义反序列化器来完成。
标签: java android retrofit moshi