我有这个代码:
Type typeOfObjectsList = new TypeToken<ArrayList<myClass>>() {}.getType();
List<myClass> objectsList = new Gson().fromJson(json, typeOfObjectsList);
Run Code Online (Sandbox Code Playgroud)
它将JSON字符串转换List为对象.但是现在我希望在运行时定义ArrayList动态类型(不仅仅是myClass).
所述ArrayList的项目类型将与被定义反射.
我试过这个:
private <T> Type setModelAndGetCorrespondingList2(Class<T> type) {
Type typeOfObjectsListNew = new TypeToken<ArrayList<T>>() {}.getType();
return typeOfObjectsListNew;
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用.这是例外:
java.sql.SQLException: Fail to convert to internal representation: {....my json....}
Run Code Online (Sandbox Code Playgroud) 多年来,我一直在使用 Jackson 来序列化/反序列化对象,并且总是发现使用TypeReference<T>反序列化List等不必要地复杂。我创建了一个简单的辅助函数:
public static <T> TypeReference<List<T>> list() {
return new TypeReference<List<T>>(){}
}
Run Code Online (Sandbox Code Playgroud)
预期用途:
List<Foo> foos = objectMapper.readValue(json, list());
Run Code Online (Sandbox Code Playgroud)
它有效!的种类。通过调试器进行检查时,不是 的列表Foo,而是 的列表LinkedHashMap。我知道ObjectMapper反序列化为LinkedHashMap类型Object,我在这里阅读了解释:
但是,为什么它能够分配List<LinkedHasMap>给 a List<Foo>?至少不应该是某种ClassCastException吗?
另外,有没有办法用Java的类型系统来做到这一点?
注意:以下方法声明具有相同的问题,这是有道理的,因为不需要T确定附加参数:
public static <T> TypeReference<List<T>> listOf(Class<T> ignored) {
return new TypeReference<List<T>>(){}
}
Run Code Online (Sandbox Code Playgroud)