1.序列化BaseResult
实际对象为BaseResult ,该类型为嵌套一层的泛型,以下转换可以成功
String responseStr = "{\"code\":\"200\",\"msg\":\"success\",\"data\":{\"item\":0}}";
TypeReference< BaseResult<T>> type = new TypeReference<BaseResult<T>>(Item.class) { };
BaseResult<T> baseResult = JSON.parseObject(responseStr, type );
2.序列化BaseResult<List>,该类型为嵌套两层的泛型,使用TypeReference构造泛型会报错,需要使用以下方式构造Type
/** 为序列化两次以上泛型提供的工具类 BaseResult<List<T>>,作用类似
* TypeReference< BaseResult<List<T>>> type = new TypeReference<BaseResult<List<T>>>(BaseResult.class, List.class, returnClazz) { };
* @param types
* @return
*/
public static Type buildType(Type... types) {
ParameterizedTypeImpl beforeType = null;
if (types != null && types.length > 0) {
for (int i = types.length - 1; i > 0; i--) {
beforeType = new ParameterizedTypeImpl(new Type[]{beforeType == null ? types[i] : beforeType}, null, types[i - 1]);
}
}
return beforeType;
}
使用:
String responseStr = "{\"code\":\"200\",\"msg\":\"success\",\"data\":[{\"item\":0}]}";
BaseResult<List<T>> baseResult = JSON.parseObject(responseStr, ReflectUtil.buildType(BaseResult.class, List.class, Item.class));
3.泛型类中根据this.class获取真实类型并序列化2层以上嵌套类型
如:
public class ItemClass extends AbstractItemClass<Item> {
BaseResult<List<T>> getItem (String responseStr) {
// 获取泛型类中的真实类型 Item.class
Class<T> returnClazz = ReflectUtil.deSerializableClazz(this.getClass());
BaseResult<List<T>> baseResult = JSON.parseObject(responseStr, ReflectUtil.buildType(BaseResult.class, List.class, returnClazz));
}
}
/**
* 获取泛型类中的真实类型 AreaNumTPDataVO
* AbstractItemClass<Item>
* @param clazz
* @param <T>
* @return
*/
public static <T> Class<T> deSerializableClazz(Class clazz) {
Type type = clazz.getGenericSuperclass();
if (type instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) type;
System.out.println(parameterizedType.getActualTypeArguments()[0]);
return (Class<T>) parameterizedType.getActualTypeArguments()[0];
}
throw new RuntimeException();
}
最后附一张关系图
参考:
fastjson反序列化多层嵌套泛型类与java中的Type类型
打个赌你可能不知道如何获取Java泛型的Class对象
Java如何优雅获取泛型类型