I have a method for reading JSON from a service, I'm using Gson to do my serialization and have written the following method using type parameters.
public T getDeserializedJSON(Class<T> aClass,String url)
{
Reader r = getJSONDataAsReader(url);
Gson gson = new Gson();
return gson.fromJson(r, aCla开发者_运维知识库ss);
}
I'm consuming json which returns just an array of a type e.g.
[
{ "prop":"value" }
{ "prop":"value" }
]
I have a java class which maps to this object let's call it MyClass. However to use my method I need to do this:
RestClient<ArrayList<MyClass>> restClient = new RestClient<ArrayList<MyClass>>();
ArrayList<MyClass> results = restClient.getDeserializedJSON(ArrayList<MyClass>.class, url);
However, I can't figure out the syntax to do it. Passing just ArrayList.class doesn't work.
So is there a way I can get rid of the Class parameter or how do I get the class of the ArrayList of MyClass?
You can use Bozho's solution, or avoid the creation of a temporary array list by using:
Class<List<MyClass>> clazz = (Class) List.class;
The only problem with this solution is that you have to suppress the unchecked warning with @SuppressWarnings("unchecked")
.
You can't. You'd have to use unsafe cast:
Class<List<MyClass>> clazz =
(Class<List<MyClass>>) new ArrayList<MyClass>().getClass();
As a follow up to this, I found this in the Gson docs.
Type listType = new TypeToken<List<String>>() {}.getType();
Which solves the problem of getting the type safely but the TypeToken class is specific to Gson.
If you are using SpringFramework
you could use ParameterizedTypeReference
as follows:
restClient.getDeserializedJSON(ParameterizedTypeReference<List<MyClass>>(){},url);
I had a similar scenario but I have a workaround to use an array instead of ArrayList
MyClass[] results = restClient.getDeserializedJSON(MyClass[].class, url);
And here what deserialize method does
You can then proceed with list as follows:
List<MyClass> r_results= Arrays.stream(results).collect(Collectors.toList());
Depending on how is your requirement, but if you are ok working with array there you can provide as Class: MyClass[].class
精彩评论