嗯,我有这个: 多个webservice,每个webservice返回一个实体的数组。好!
在我的 Android 应用程序中,我调用 Web 服务并获取包含元素数组的 Json 字符串。
为了使其动态化,我用强制转换类名称创建了一个数组,例如:
<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]);
网络服务总是返回一个数组,然后我想像这样将 Json 转换为 Java 列表
//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 行解决了我的问题(可能比这少)
希望对大家有帮助!
最佳答案
我相信没有办法用 TypeToken
来完成您想要做的事情。然而,GSON 实际上可以处理任何 ParameterizedType
传入 gson.fromJson
方法,实现该接口(interface)相对简单。
在您的具体情况下,我们希望构建一个原始类型为 List
的类型,其类型参数为 Person
、Animal
或事物
。下面的类允许我们构建这样的类型:
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;
}
}
假设我们有一些类似的 JSON
String json = "[{\"name\": \"Charlie\"}]";
和具有“name”属性的 Person
和 Animal
类,然后我们可以使用适当的 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
关于Java:动态列表类型来转换 Json 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36286991/