相关疑难解决方法(0)

具有动态ArrayList项类型的Gson TypeToken

我有这个代码:

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)

java reflection arraylist gson

68
推荐指数
7
解决办法
8万
查看次数

如何使用 Jackson 反序列化泛型 List&lt;T&gt;?

多年来,我一直在使用 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,我在这里阅读了解释:

Jackson 和泛型类型引用

但是,为什么它能够分配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)

java class list type-erasure jackson

5
推荐指数
1
解决办法
3506
查看次数

标签 统计

java ×2

arraylist ×1

class ×1

gson ×1

jackson ×1

list ×1

reflection ×1

type-erasure ×1