Deserialize json string into generically typed list

馋奶兔 提交于 2019-12-25 16:59:26

问题


I want to include in my Service objects a generic way of deserializing lists of objects from a json string.

Below was my first attempt.

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

However due to type erasure, the T in: new TypeToken<List<T>>() {}.getType(); is not available at run time. So instead of getting a list of my entities back, Gson returns a list of Gson Map objects.

NOTE, that I do have access at runtime to the concrete class of T, by calling getClazz(). Although I'm not sure how I can use this to instruct Gson to send me back a list of a certain type.

Does anyone know a way of getting this to work?

Any help would be appreciated.


回答1:


Worked it out.

According to gson docs here, you need to split the string into individual elements, and deserialize those seperately.

"Use Gson's parser API (low-level streaming parser or the DOM parser JsonParser) to parse the array elements and then use Gson.fromJson() on each of the array elements. This is the preferred approach. Here is an example that demonstrates how to do this."

So my solution becomes:

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


来源:https://stackoverflow.com/questions/21176195/deserialize-json-string-into-generically-typed-list

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!