Gson序列化和反序列时,如果Object是泛型,那么就需要特别的处理。
假设要将一段json字符串转换为List
处理方法一
使用TypeToken
gson.fromJson(jsonStr, new TypeToken<List<Object>>(){}.getType());
处理方法二
现在有一个问题,我想做一个统一处理方法,只要传入Object.class就可以返回List
public static class ParameterizedTypeImpl implements ParameterizedType {
private final Class raw;
private final Type[] args;
public static ParameterizedTypeImpl of(Class... classes) {
if(classes.length == 0) {
return new ParameterizedTypeImpl(null, new Type[0]);
}
if(classes.length == 1) {
return new ParameterizedTypeImpl(classes[0], null);
}
Type tem = classes[classes.length - 1];
ParameterizedTypeImpl result = null;
for (int i = classes.length - 2; i >= 0; i--) {
result = new ParameterizedTypeImpl(classes[i], new Type[] {tem});
tem = result;
}
return result;
}
public ParameterizedTypeImpl(Class raw, Type[] args) {
this.raw = raw;
this.args = args != null ? args : new Type[0];
}
@Override
public Type[] getActualTypeArguments() {
return args;
}
@Override
public Type getRawType() {
return raw;
}
@Override
public Type getOwnerType() {
return null;
}
}
那么调用方式就变成了:
<T> T fun(Class<T> clazz) {
String jsonStr = "...";// 省略jsonStr的联网获取代码
return gson.fromJson(jsonStr, ParameterizedTypeImpl.of(List.class, clazz));
}
还没有深究ParameterizedType 的这么用的原理,从网上找到的代码,自己修改的。
文档信息
- 本文作者:itlgl
- 本文链接:https://itlgl.com/note/2019/09/06/issues-38/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)