我有一个从服务中读取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类?
答案 0 :(得分:23)
您可以使用Bozho的解决方案,或使用以下方法避免创建临时数组列表:
Class<List<MyClass>> clazz = (Class) List.class;
此解决方案的唯一问题是您必须使用@SuppressWarnings(“未选中”)来取消未经检查的警告。
答案 1 :(得分:6)
作为后续跟进,我在Gson文档中找到了这个。
Type listType = new TypeToken<List<String>>() {}.getType();
这解决了安全获取类型的问题,但TypeToken类特定于Gson。
答案 2 :(得分:5)
你做不到。你必须使用不安全的演员:
Class<List<MyClass>> clazz =
(Class<List<MyClass>>) new ArrayList<MyClass>().getClass();
答案 3 :(得分:0)
如果您使用的是$result = [];
$array1 = [
[
"id" => 1,
"other_data" => "text1"
],
[
"id" => 2,
"other_data" => "text2"
],
[
"id" => 3,
"other_data" => "text3"
],
];
$array2 = [
[
"id" => 1,
"other_data" => "text1"
],
[
"id" => 8,
"other_data" => "text8"
],
];
$merge_array = function($array, $result) {
foreach($array as $element) {
$id = $element["id"]; //In your case it could be $element->getId()
if(!isset($result[$id])) {
$result[$id] = $element;
}
}
return $result;
};
$result = $merge_array($array1, $result);
$result = $merge_array($array2, $result);
print_r(array_values($result));
,则可以使用SpringFramework
如下:
ParameterizedTypeReference
答案 4 :(得分:0)
我遇到了类似的情况,但我有一个解决方法来使用数组而不是 ArrayList
MyClass[] results = restClient.getDeserializedJSON(MyClass[].class, url);
这里 deserialize 方法的作用
然后您可以按如下方式继续列表:
List<MyClass> r_results= Arrays.stream(results).collect(Collectors.toList());
答案 5 :(得分:0)
取决于您的要求,但如果您可以在那里使用数组,则可以提供 Class:MyClass[].class