我想构建一个类,使用Gson将List<T>
解析为String
:
private static class ListParser<T> {
Gson gson = new Gson();
public Type getGenericClass() {
Type listType = new TypeToken<List<T>>() {
}.getType();
return listType;
}
public String toJson(List<T> list) {
return gson.toJson(list, getGenericClass());
}
public List<T> fromJson(String json) {
List<T> list1 = gson.fromJson(json, getGenericClass());
List<T> list2 = new ArrayList<T>();
for (int i = 0; i < list1.size(); i++) {
T val = (T) list1.get(i);
list2.add(val);
}
return list2;
}
}
我使用TypeToken
作为我发现的一些教程,但list1
和list2
都是List<Double>
。我想知道无论如何都要在Java中解析List<Double>
到List<T>
。
答案 0 :(得分:0)
您的getGenericClass()
无效,您需要检索T类。
您可以提供:
Class<T> type;
public Class<T> getType() {
return this.type;
}
或者在运行时获取它(不安全,我认为你可以在这个子喷气机上找到很多帖子)
public Class<T> getType() {
return (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
然后,要构建列表令牌,您可以使用以下代码:
static TypeToken<?> getGenToken(final Class<?> raw, final Class<?> gen) throws Exception {
Constructor<ParameterizedTypeImpl> constr = ParameterizedTypeImpl.class.getDeclaredConstructor(Class.class, Type[].class, Type.class);
constr.setAccessible(true);
ParameterizedTypeImpl paramType = constr.newInstance(raw, new Type[] { gen }, null);
return TypeToken.get(paramType);
}
检查我在此处提供的示例:GSON deserialize an array of complex objects