Gson将通用列表反序列化为通用方法

时间:2014-08-05 16:08:50

标签: java json generics gson

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

有没有人知道我该怎么做才能解决它?

PS:有一段时间我已经在列表中创建了循环,逐个实体序列化,拆分返回的String并逐个实体反序列化,但显然它是一个解决方法

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

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

1 个答案:

答案 0 :(得分:3)

解决方案 - 这是为我工作的: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);
    }
}