【问题标题】:Deserialize json string into generically typed list将 json 字符串反序列化为通用类型列表
【发布时间】:2014-01-17 01:21:41
【问题描述】:

我想在我的服务对象中包含一种从 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;
    }
}

但是由于类型擦除,T in: new TypeToken&lt;List&lt;T&gt;&gt;() {}.getType(); 在运行时不可用。因此,Gson 不会返回我的实体列表,而是返回 Gson Map 对象列表。

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

有没有人知道让它工作的方法?

任何帮助将不胜感激。

【问题讨论】:

  • 可以传参数吗?

标签: java json generics gson


【解决方案1】:

解决了。

根据 gson docs here,您需要将字符串拆分为单个元素,并分别反序列化这些元素。

"使用 Gson 的解析器 API(低级流解析器或 DOM 解析器 JsonParser)解析数组元素,然后对每个数组元素使用 Gson.fromJson()。这是首选方法。这是一个 @ 987654322@ 演示了如何执行此操作。”

所以我的解决方案变成:

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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    相关资源
    最近更新 更多