Java:动态列表类型来转换 Json 数组

标签 java android json reflection

嗯,我有这个: 多个webservice,每个webservice返回一个实体的数组。好!

在我的 Android 应用程序中,我调用 Web 服务并获取包含元素数组的 Json 字符串。

为了使其动态化,我用强制转换类名称创建了一个数组,例如:

<item>com.company.package.Person</item>
<item>com.company.package.Animal</item>
<item>com.company.package.Thing</item>
// etc

这个想法是:

  1. 使用类名称加载数组以转换 JSON

    String[] entities = getResources().getStringArray(R.array.classNames);
    
  2. 使用Class.forName(...)获取类类型

    Class<?> object = Class.forName(entities[y]); 
    
  3. 网络服务总是返回一个数组,然后我想像这样将 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 的类型,其类型参数为 PersonAnimal事物。下面的类允许我们构建这样的类型:

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”属性的 PersonAnimal 类,然后我们可以使用适当的 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/

相关文章:

ajax - Extjs 自定义阅读器

java - 替换 GlobalSettings.onStart 和 onStop

Java 将 XML 转换为 YAML

java - TableModelEvent.getcolumn() 返回 -1

java - 使用 Scanner.nextLine() 方法的时机

android - React Native & Socket.io - 无法在应用程序和服务器之间建立连接

android - 在 Kotlin 中将 ArrayList 转换为字符串的最佳方法

android - Activity 泄漏了原本是 android 的窗口

Tomcat 中的 HTML Href

json - 如何将此Complex Json转换为Dart对象