我有这个代码:
Type typeOfObjectsList = new TypeToken<ArrayList<myClass>>() {}.getType();
List<myClass> objectsList = new Gson().fromJson(json, typeOfObjectsList);
Run Code Online (Sandbox Code Playgroud)
它将JSON字符串转换List为对象.但是现在我希望在运行时定义ArrayList动态类型(不仅仅是myClass).
所述ArrayList的项目类型将与被定义反射.
我试过这个:
private <T> Type setModelAndGetCorrespondingList2(Class<T> type) {
Type typeOfObjectsListNew = new TypeToken<ArrayList<T>>() {}.getType();
return typeOfObjectsListNew;
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用.这是例外:
java.sql.SQLException: Fail to convert to internal representation: {....my json....}
Run Code Online (Sandbox Code Playgroud) 我正在编写一个将连接到服务器并基于某些参数的类,检索一个json-string,该字符串将使用GSON解析为指定的(通过泛型)类.
这个课程的精简版看起来像这样:
class Executor<T> {
private Response<T> response;
public void execute() {
Type responseType = new TypeToken<Response<T>>() {}.getType();
this.response = new Gson().fromJson(json, responseType);
}
public Response<T> getResponse() { return this.response; }
}
Run Code Online (Sandbox Code Playgroud)
(JSON变量看起来像这样.)
一旦反序列化存储数据的类如下所示:
class Response<T> {
private List<T> data = null;
public List<T> getData() { return this.data; }
}
Run Code Online (Sandbox Code Playgroud)
数据尝试反序列化的类:
public class Language {
public String alias;
public String label;
}
Run Code Online (Sandbox Code Playgroud)
运行的代码使用上面的类:
Executor<Language> executor = new Executor<Language();
List<Language> languages = executor.execute().getResponse().getData();
System.out.println(languages.get(0).alias); // exception occurs …Run Code Online (Sandbox Code Playgroud) 在使用Android应用程序时,我遇到了一个问题,当我想制作一个最终的通用方法来发送HTTP请求(使用loopj)并反序列化它们(使用Gson).
您可能知道在使用gson.fromJson时不能这样做:
gson.fromJson(responseBody, new TypeToken<T>() {}.getType());
Run Code Online (Sandbox Code Playgroud)
要么
gson.fromJson(responseBody, new TypeToken<ArrayList<T>>() {}.getType())
Run Code Online (Sandbox Code Playgroud)
T您将获得LinkedTreeMap对象(或LinkedTreeMap对象列表),而不是您传递的实际对象(或第二种情况下的实际对象列表).
如果你想要仍然想要反序列化泛型类型对象(-s),请参阅下面的答案.
+ Bonus:loopj + gson的终极通用解决方案
感谢这些帖子的作者和评论者:
http://blog.xebia.com/2009/02/07/acessing-generic-types-at-runtime-in-java/
我正在尝试解决反序列化HashMap<Integer, MyParcelablePojo>. 试图找到答案,我发现了以下问题:
如果我尝试:
HashMap<Integer, MyParcelablePojo> mHashMap = new Gson().fromJson(the_json_string, HashMap.class);
Run Code Online (Sandbox Code Playgroud)
...结果HashMap包含LinkedTreeMap对象而不是MyParcelablePojo对象。
因此,我尝试以TypeToken与我在上面链接的第二个问题中看到的类似的方式使用 a ,但它不允许我指定HashMap. 如果我尝试:
// XXX I am not sure if this "Type" is the correct one
// there were several "Type" classes to choose from
import java.lang.reflect.Type;
import com.google.gson.reflect.TypeToken;
Type collection_type = new TypeToken<HashMap<Integer, MyParcelablePojo>>();
Run Code Online (Sandbox Code Playgroud)
...Android Studio 向我展示了这个错误:
“TypeToken()”在“com.google.gson.reflect.TypeToken”中具有受保护的访问权限
...只是为了坚持我看到的例子,我试着new TypeToken<HashMap<T>>看看错误是否消失了(只是出于好奇,我对使用泛型根本不感兴趣T),然后它说“无法解析 T”,这太奇怪了......但这与我的问题无关,我只是为了完整性而添加它......
...回到正题,所以TypeToken …