好吧,我有这个: 许多web服务,每个webservice返回一个实体的数组。好!
在我的Android应用程序中,我调用webservices并使用元素数组获取Json String。
为了使它成为动态的,我创建了一个带有转换类名称的数组,例如:
<item>com.company.package.Person</item>
<item>com.company.package.Animal</item>
<item>com.company.package.Thing</item>
// etc
这个想法是:
使用类的名称加载数组以强制转换JSON
String[] entities = getResources().getStringArray(R.array.classNames);
获取Class.forName(...)
Class<?> object = Class.forName(entities[y]);
Webservices总是返回一个数组,然后我想把Json转换成这样的Java List
//see the **object**, this was my idea but doesn't work
Type type = new TypeToken<List<**object**>() {}.getType();
List<**object**> array = gson.fromJson(jsonArrayString, type);
有什么办法吗?
此作品
我找到了办法
编写我自己的ParameterizedType
列表(@ andersschuller答案)并使用此
Class<?> clazz = Class.forName(entities[y]);
Type type = new ParameterizedTypeList(clazz.newInstance().getClass());
List<? extends Object> array = SystemUtils.factoryGson().fromJson(datos.get(y).toString(), type);
解决了我的问题3行(可能还不到这个)
希望能帮助任何人!答案 0 :(得分:1)
我相信你无法用TypeToken
做你想做的事情。但是,GSON实际上可以处理传递给gson.fromJson
方法的任何ParameterizedType
,并且实现此接口相对简单。
在您的特定情况下,我们要构建一个原始类型为List
的类型,其类型参数为Person
,Animal
或Thing
。以下类允许我们构建这样的类型:
public static class ListType implements ParameterizedType {
private final Class<?> elementClass;
public ListType(Class<?> elementClass) {
this.elementClass = elementClass;
}
@Override
public Type[] getActualTypeArguments() {
return new Type[]{elementClass};
}
@Override
public Type getRawType() {
return List.class;
}
@Override
public Type getOwnerType() {
return null;
}
}
假设我们有一些像
这样的JSONString json = "[{\"name\": \"Charlie\"}]";
以及Person
和Animal
类具有&#34;名称&#34;然后,我们可以使用适当的ListType
实例将此JSON反序列化为列表:
List<Person> people = gson.fromJson(json, new ListType(Person.class));
System.out.println(people.get(0).getClass().getSimpleName()); // prints Person
System.out.println(people.get(0).name); // prints Charlie
List<Animal> animals = gson.fromJson(json, new ListType(Animal.class));
System.out.println(animals.get(0).getClass().getSimpleName()); // prints Animal
System.out.println(animals.get(0).name); // prints Charlie