Java:用于强制转换Json数组的动态列表类型

时间:2016-03-29 14:17:45

标签: java android json reflection

好吧,我有这个: 许多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

这个想法是:

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

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

    的班级类型
    Class<?> object = Class.forName(entities[y]); 
    
  3. 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);
    
  4. 有什么办法吗?

    此作品

    我找到了办法

    编写我自己的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行(可能还不到这个)

    希望能帮助任何人!

1 个答案:

答案 0 :(得分:1)

我相信你无法用TypeToken做你想做的事情。但是,GSON实际上可以处理传递给gson.fromJson方法的任何ParameterizedType,并且实现此接口相对简单。

在您的特定情况下,我们要构建一个原始类型为List的类型,其类型参数为PersonAnimalThing。以下类允许我们构建这样的类型:

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\"}]";

以及PersonAnimal类具有&#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