【问题标题】:Gson deserialize generic list into a generic methodGson 将泛型列表反序列化为泛型方法
【发布时间】:2014-08-05 16:08:49
【问题描述】:

当我在泛型方法中有一个列表时,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

【问题讨论】:

标签: java json generics gson


【解决方案1】:

解决方案 - 这对我有用: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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多