fastjson使用TypeReference反序列化2层以上嵌套泛型类
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如何优雅获取泛型类型