简体   繁体   English

使用 GSON 从 ClassLouder 类中反序列化泛型类型

[英]Deserializing Generic Types from a ClassLouder class with GSON

I´m trying to parse a JSON file using GSON, the problem is that I´m using a Class that it was previously loaded by ClassLoader.我正在尝试使用 GSON 解析一个 JSON 文件,问题是我使用的是一个以前由 ClassLoader 加载的类。

File root = new File("./build/classes");
URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { root.toURI().toURL() });

Class<?> loadedClass = Class.forName("events.Source", true,classLoader);


// JSON --> Java "Get the actual type"
Type listType = new TypeToken<ArrayList<loadedClass>>() {}.getType(); 

Gson gson = new Gson();

ArrayList<loadedClass> resourcesList = gson.fromJson(jsonString, listType);

That returns a com.google.gson.internal.LinkedTreeMap not a List of my own loadedClass .这将返回com.google.gson.internal.LinkedTreeMap而不是我自己的加载类列表 Any help?有什么帮助吗?

see here a default implementation of ParametrizedType:在此处查看 ParametrizedType 的默认实现:

http://www.java2s.com/Code/Java/Generics/DefaultimplementationoflinkjavalangreflectParameterizedType.htm http://www.java2s.com/Code/Java/Generics/DefaultimplementationoflinkjavalangreflectParameterizedType.htm

properly prepared, such a type could be used to represent a generic type, which may work with GSON.准备妥当,这样的类型可用于表示可与 GSON 一起使用的通用类型。 Without having tested it, your code might then look like this:未经测试,您的代码可能如下所示:

File root = new File("./build/classes");
URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] {
   root.toURI().toURL()
});
Class<?> loadedClass = Class.forName("events.Source", true,classLoader);

// JSON --> Java "Create the actual type"
Type listType = new DefaultParameterizedType(ArrayList.class, loadedClass);

Gson gson = new Gson();
ArrayList<loadedClass> resourcesList = gson.fromJson(jsonString, listType);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM