猿问

具有动态ArrayList项目类型的GSON TypeToken

具有动态ArrayList项目类型的GSON TypeToken

我有个密码:

Type typeOfObjectsList = new TypeToken<ArrayList<myClass>>() {}.getType();
List<myClass> objectsList = new Gson().fromJson(json, typeOfObjectsList);

它将JSON字符串转换为List物体。但现在我想要这个ArrayList具有动态类型(不仅仅是myClass),在运行时定义。

这个ArrayList项目类型将用反射.

我试过这个:

    private <T> Type setModelAndGetCorrespondingList2(Class<T> type) {
        Type typeOfObjectsListNew = new TypeToken<ArrayList<T>>() {}.getType();
        return typeOfObjectsListNew;
    }

但不管用。这是例外:

java.sql.SQLException: Fail to convert to internal representation: {....my json....}


森林海
浏览 1015回答 3
3回答

慕田峪9158850

从gson2.8.0开始,您可以使用TypeToken#getParameterized(Type rawType, Type... typeArguments)若要创建TypeToken,然后getType()应该能行。例如:TypeToken.getParameterized(ArrayList.class,&nbsp;myClass).getType()

慕神8447489

您提议的语法无效。以下内容new&nbsp;TypeToken<ArrayList<Class.forName(MyClass)>>无效,因为您试图传递一个方法调用,其中需要类型名称。以下内容new&nbsp;TypeToken<ArrayList<T>>()由于泛型(类型擦除)和反射的工作方式不可能实现。整体TypeToken黑客工作是因为Class#getGenericSuperclass()执行以下操作返回表示由该类表示的实体(类、接口、原始类型或空)的直接超类的类型。如果超类是参数化类型,则返回的Type对象必须准确地反映源代码中使用的实际类型参数。换句话说,如果它看到ArrayList<T>,那是ParameterizedType它将返回,您将无法提取类型变量的编译时值。T应该会的。Type和ParameterizedType都是接口。您可以提供自己实现的实例。
随时随地看视频慕课网APP

相关分类

Java
我要回答