具有动态 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....}

原文由 Amin Sh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 857
2 个回答

您建议的语法无效。以下

new TypeToken<ArrayList<Class.forName(MyClass)>>

无效,因为您正试图在需要类型名称的地方传递方法调用。

以下

new TypeToken<ArrayList<T>>()

由于泛型(类型擦除)和反射的工作方式,这是不可能的。整个 TypeToken hack 有效,因为 Class#getGenericSuperclass() 执行以下操作

返回表示此类所表示的实体(类、接口、原始类型或 void)的直接超类的 Type。

如果超类是参数化类型,则返回的 Type 对象必须准确反映源代码中使用的实际类型参数。

换句话说,如果它看到 ArrayList<T> ,那就是 ParameterizedType 它会返回,你将无法提取类型变量 T 的编译时值 --- 本来有。

TypeParameterizedType 都是接口。您可以提供您自己的实现实例(定义一个实现任一接口并覆盖其方法的类)或使用 TypeToken 在其最新版本中提供的一种有用的工厂方法。例如,

 private Type setModelAndGetCorrespondingList2(Class<?> typeArgument) {
    return TypeToken.getParameterized(ArrayList.class, typeArgument).getType();
}

原文由 Sotirios Delimanolis 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题