java - 通用模型类
问题描述
我正在使用一些 Web 服务,并且我使用许多 Web 服务来检索信息。由于有许多 Web 服务,我创建了一个模型类来映射来自 Web 服务的结果。
尽管 Web 服务的响应结构相同,但内容不同。所以我创建了一个通用模型来获取如下响应。
public class GenericResponse<T> {
private List<T> Results;
private ErrorResponseModel Status;
public List<T> getResults() {
return Results;
}
public ErrorResponseModel getStatus() {
return Status;
}
}
我希望将此结果分配给相关模型,以便我可以使用 getter 访问数据。
List<SomeModelClass> result= webServiceResponse.getResults();
但是使用上述方式,当我尝试访问 getter 时,它会给出下面提到的错误。
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to...
这样做的正确方法是什么?
注意:有一种方法可以做到这一点,我已经尝试过了,您可以将此响应转换为 Gson,然后使用相关的对象类对其进行反序列化。这样它就可以工作,但不知道这是否是好的做法。
解决方案
你的课的问题是,你总是期望结果是一个列表。您可以做的是将结果更改为 private T result
,在这种情况下,如果您的结果将是字符串,则 T 将是字符串,如果结果将是 Foos 列表,则 T 将是List<Foo>
。
编辑
如果您对结果的序列化有疑问,则需要JsonDeserializer
为该类型定义。
class MyResultDeserializer implements JsonDeserializer<MyResult>() {
public Id deserialize(JsonElement json, Type type, JsonDeserializationContext context)
throws JsonParseException {
return new MyResult(id.getValue());
}
}
并注册
GsonBuilder builder = new GsonBuilder()
builder.registerTypeAdapter(MyResult.class, new MyResultDeserializer());
推荐阅读
- apache-spark - pyspark rdd/dataframe 不会自动在 cassandra 中创建表
- android - RecyclerView onclick - 滚动到该项目并显示褪色背景
- azure - 是否可以在 Azure 函数和 Azure Web API 之间启用托管标识?
- batch-file - 如何打开特定坐标的特定exe应用程序
- ipfs - 如何找出 ipfs 运行缓慢的原因?
- pandas - 如果空白,熊猫会合并行
- rust - 为什么 cargo 为 rand 包下载 libc?
- python - Python中的重载列表理解机制
- javascript - 基于数组 ReactJS 的自动选中复选框
- go - 如何将结构保存为扁平化的 json?