json 反序列化 父子类型,将json字符串反序列化为一般类型列表

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{

public abstract Class getClazz();

public List deserialize(final String json){

Gson gson = gsonFactory.create();

Type listType = new TypeToken>() {}.getType();

List entityList = gson.fromJson(json, listType);

return entityList;

}

}

However due to type erasure, the T in: new TypeToken>() {}.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.

解决方案

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{

public abstract Class getClazz();

public List deserialize(final String json){

JsonArray array = parser.parse(json).getAsJsonArray();

final List entityList = new ArrayList();

for(final JsonElement jsonElement: array){

T entity = gson.fromJson(jsonElement, getClazz());

entityList.add(entity);

}

return entityList;

}

}

你可能感兴趣的:(json,反序列化,父子类型)