将json字符串反序列化为通用类型列表

时间:2014-01-17 01:21:42

标签: java json generics gson

我希望在我的Service对象中包含一个从json字符串反序列化对象列表的通用方法。

以下是我的第一次尝试。

public abstract class AbstractService<T>{

    public abstract Class<T> getClazz();

    public List<T> deserialize(final String json){
        Gson gson = gsonFactory.create();
        Type listType = new TypeToken<List<T>>() {}.getType();
        List<T> entityList = gson.fromJson(json, listType);
        return entityList;
    }
}

但是由于类型擦除,运行时无法使用{in new TypeToken<List<T>>() {}.getType();中的T:因此,Gson不会返回我的实体列表,而是返回一个Gson Map对象列表。

注意,通过调用getClazz(),我确实可以在运行时访问T的具体类。虽然我不确定如何使用它来指示Gson将某个类型的列表发回给我。

有没有人知道如何让它发挥作用?

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

解决了这个问题。

根据gson docs here,您需要将字符串拆分为单独的元素,并单独对其进行反序列化。

“使用Gson的解析器API(低级流解析器或DOM解析器JsonParser)来解析数组元素,然后在每个数组元素上使用Gson.fromJson()。这是首选方法。这是一个{ {3}}演示如何执行此操作。“

所以我的解决方案变成了:

public abstract class AbstractService<T>{

    public abstract Class<T> getClazz();

    public List<T> deserialize(final String json){
        JsonArray array = parser.parse(json).getAsJsonArray();
        final List<T> entityList = new ArrayList<V>();
        for(final JsonElement jsonElement: array){
            T entity = gson.fromJson(jsonElement, getClazz());
            entityList.add(entity);
        }
        return entityList;
    }
}