我有一个响应类 - MyResponse如下所示,使用Retrofit2调用服务器。 resource
是一个对象数组。
public class MyResponse {
@SerializedName("success")
@Expose
private Boolean success;
@SerializedName("resource")
@Expose
private Array[] resource;
public ApiResponse(Boolean done, Array[] resource) {
this.done = done;
this.resource = resource;
}
//getters and setters
}
在Activity中,我创建了一个Array,如下所示:
MyResponse decodedResponse = response.body();
Array[] catsList = decodedResponse.getResource();
我有一个Model类Category
,如下所示:
public class Category {
@SerializedName("id")
@Expose
private Integer id;
@SerializedName("category")
@Expose
private String category;
//getters, setter and constructor
}
上面的catsList数组的每个对象都遵循上面的类别模型(带有id和类别键)。现在我如何从上面的catsList数组中创建一个Category(Category[]
)数组?
我不能像Category[] catsList = decodedResponse.getObject();
那样做,因为我想为其他模型创建更多数组。因此,我计划如上所述创建一个通用的MyResponse类,并在需要时将其生成的数组转换为特定的模型。
也不支持以下方法(在MyResponse中更改Array[] =to=> Object[]
之后)。它给出java.lang.ClassCastException: java.lang.Object[] cannot be cast to my.package.Category[]
例外。
Object[] catsList = decodedResponse.getObject();
Category[] catsListCooked = (Category[]) catsList;
修改 我对服务器的JSON响应对每种请求类型都有相同的样式,并且对一种请求类型使用一种模型。因为Retrofit想要知道哪个模型类将用于呼叫,以便进行如下呼叫。
@GET()
Call<MyResponse> getCategories(@Url String url);
注意: 如果我能以其他方式执行此操作,请更正我。因为我如上所述打电话,所以我需要有一个班级才能打电话。
所以我想做的是创建一个主响应(如上所述的MyResponse),它将接收响应,然后根据请求类型使用每个模型获取接收的数据。在进行调用时无法直接使用模型,因为我有来自服务器的自定义JSON响应。
即。如果直接使用模型,那么它会产生错误,例如预期的BEGIN_ARRAY但提供BEGIN_OBJECT 或预期的BEGIN_OBJECT但提供BEGIN_ARRAY 。
如下所述,根据建议的重复项,this suggestion ytg似乎可以实现解决方案。但是在那里建议使用Arrays.copyOf(),它似乎不是创建Category[]
数组有用,因为它给出了#34; ...不能存储在类型的目标数组中......&#34 ;错误。在我的案例中,该问题的其他解决方案也是不可行的。