相关疑难解决方法(0)

具有动态ArrayList项类型的Gson TypeToken

我有这个代码:

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)

java reflection arraylist gson

68
推荐指数
7
解决办法
8万
查看次数

使用GSON反序列化嵌套的泛型类时的奇怪行为

我正在编写一个将连接到服务器并基于某些参数的类,检索一个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)

java oop generics reflection gson

10
推荐指数
1
解决办法
7503
查看次数

来自Json的Gson反编译泛型

在使用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/

如何获得具体类型的通用接口

Java Type Generic作为GSON的参数

java generics json gson deserialization

6
推荐指数
1
解决办法
4525
查看次数

为什么我不能按照我需要的方式使用 TypeToken?

我正在尝试解决反序列化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 …

java oop generics android gson

0
推荐指数
1
解决办法
2188
查看次数

标签 统计

gson ×4

java ×4

generics ×3

oop ×2

reflection ×2

android ×1

arraylist ×1

deserialization ×1

json ×1