Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.1k views
in Technique[技术] by (71.8m points)

java - Deserialize json string into generically typed list

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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

1.4m articles

1.4m replys

5 comments

57.0k users

...