java - Gson将泛型列表反序列化为泛型方法

标签 java json generics gson

当我在泛型方法中有一个列表时,Gson 返回一个 Object 列表而不是一个泛型类型列表。 我见过很多没有解决方案的线程,如果我不使用通用方法,则必须为每个 bean 创建一个方法。

有没有人知道我必须做什么才能解决它?

PS:有一段时间我在列表中创建循环以逐个实体序列化实体,拆分返回的字符串并逐个实体反序列化实体,但显然这是一种解决方法

创建通用列表并序列化为 JSON(这是一种网络服务方法):

public String listEntity(String nomeClasse) throws WsException {
    // Identifying the entity class
    Class<?> clazz = Class.forName(nomeClasse);

    // Querying with Hibernate
    List<?> lst = getDao().listEntity(clazz);

    // Check if is null
    if (lst == null) {
        return "[]";
    }

    return gson.toJson(lst);
}

使用 Webservice 方法:

public <T> List<T> listEntity(Class<T> clazz)
        throws WsIntegracaoException {
    try {
        // Consuming remote method
        String strJson = getService().listEntity(clazz.getName());

        Type type = new TypeToken<List<T>>() {}.getType();

        // HERE IS THE PROBLEM
        List<T> lst =  GSON.fromJson(strJson, type);
        // RETURNS IS A LIST OF OBJECT INSTEAD OF A LIST OF <T>

        return lst;

    } catch (Exception e) {
        throw new WsIntegracaoException(
                "WS method error [listEntity()]", e);
    }
}

调用泛型方法:

List<City> list =  listEntity(City.class);
// Here I get a ClassCastException
fillTable(list);

列表元素(错误):

java.lang.Object@23f6b8

异常:

java.lang.ClassCastException: java.lang.Object 无法转换为 java.io.Serializable

最佳答案

解决方案 - 这对我有用:Gson TypeToken with dynamic ArrayList item type

public <T> List<T> listEntity(Class<T> clazz)
        throws WsIntegracaoException {
    try {
        // Consuming remote method
        String strJson = getService().listEntity(clazz.getName());

        JsonParser parser = new JsonParser();
        JsonArray array = parser.parse(strJson).getAsJsonArray();

        List<T> lst =  new ArrayList<T>();
        for(final JsonElement json: array){
            T entity = GSON.fromJson(json, clazz);
            lst.add(entity);
        }

        return lst;

    } catch (Exception e) {
        throw new WsIntegracaoException(
                "WS method error [listEntity()]", e);
    }
}

关于java - Gson将泛型列表反序列化为泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25143522/

相关文章:

eclipse - 以编程方式在插件中设置java eclipse项目的JRE

java - 使用正则表达式从全名中删除称呼语

java - org.hibernate.exception.SQLGrammarException : hibernate will not join column

java - 字符串到 HashMap 到 Gson 转换给出错误 com.google.gson.stream.MalformedJsonException : Unterminated object

c# - 通用列表的通用扩展方法

java - Hibernate Embedded 类作为 NaturalId

json - 如何从Grails中的JSON列表生成JSON

json - 使用 System.Text.Json 序列化实现接口(interface)的对象

Java:如何从泛型类型获取类文字?

java - 用于泛型类扩展的 Mockito/Powermock 类构造