20

我有一种从服务中读取 JSON 的方法,我正在使用 Gson 进行序列化,并使用类型参数编写了以下方法。

public T getDeserializedJSON(Class<T> aClass,String url)
{
    Reader r = getJSONDataAsReader(url);
    Gson gson = new Gson();
    return gson.fromJson(r, aClass);
}

我正在使用 json ,它只返回一个类型的数组,例如

[
 { "prop":"value" }
 { "prop":"value" }
]

我有一个映射到这个对象的 java 类,我们称之为 MyClass。但是要使用我的方法,我需要这样做:

RestClient<ArrayList<MyClass>> restClient = new RestClient<ArrayList<MyClass>>();
ArrayList<MyClass> results = restClient.getDeserializedJSON(ArrayList<MyClass>.class, url);

但是,我无法弄清楚执行此操作的语法。仅传递 ArrayList.class 不起作用。

那么有没有办法可以摆脱 Class 参数或如何获取 MyClass 的 ArrayList 的类?

4

6 回答 6

33

您可以使用 Bozho 的解决方案,或者使用以下方法避免创建临时数组列表:

Class<List<MyClass>> clazz = (Class) List.class;

此解决方案的唯一问题是您必须使用@SuppressWarnings("unchecked").

于 2010-05-09T15:00:33.350 回答
10

你不能。你必须使用不安全的演员:

Class<List<MyClass>> clazz = 
   (Class<List<MyClass>>) new ArrayList<MyClass>().getClass();
于 2010-05-09T14:27:10.700 回答
7

作为对此的跟进,我在 Gson 文档中找到了这个。

Type listType = new TypeToken<List<String>>() {}.getType();

这解决了安全获取类型的问题,但 TypeToken 类特定于 Gson。

于 2010-05-09T15:51:03.810 回答
1

如果您正在使用SpringFramework,您可以使用ParameterizedTypeReference 如下:

 restClient.getDeserializedJSON(ParameterizedTypeReference<List<MyClass>>(){},url);
于 2019-11-26T20:47:49.297 回答
0

我有类似的情况,但我有一个解决方法来使用数组而不是 ArrayList

MyClass[] results = restClient.getDeserializedJSON(MyClass[].class, url);

这里是反序列化方法的作用

然后,您可以按如下方式继续列表:

List<MyClass> r_results= Arrays.stream(results).collect(Collectors.toList());
于 2021-01-08T12:03:50.007 回答
0

取决于您的要求,但如果您可以在那里使用数组,您可以提供类:MyClass[].class

于 2021-02-04T11:57:16.320 回答