前言
由于使用到httpUtill来调用接口 工具类的返回是字符串
其中接口的实现返回值是个多层泛型结构的实体类 例如Result<Page<UserDto>>
当使用
JSON.parseObject("res",new TypeReference<`Result<Page<UserDto>>>{})
发现在page中存在的records变成了 jsonObject 而没用到实际的泛型
解决
- 保证泛型信息的存在 通过使用如下两种方式
astjson2默认情况下无法获取泛型信息,因为在编译期间泛型信息会被擦除。因此,需要通过一些方式来保留泛型信息,例如使用@Type注解或者TypeReference。 - 使用TypeReference
TypeReference<Result<Page<UserDto>>> typeRef = new TypeReference<Result<Page<UserDto>>>() {};
Result<Page<UserDto>> result = JSON.parseObject(jsonString, typeRef.getType());
- 使用@Type注解 (有一定的局限性) 不一定适用所有场景
在实体类中使用@Type注解来指定泛型参数的具体类型,例如:
import com.alibaba.fastjson2.annotation.JSONField;
import com.alibaba.fastjson2.annotation.JSONType;@JSONType(orders = {@JSONType.Order(name = "result"), @JSONType.Order(name = "data")})
public class Result<T> {@JSONField(ordinal = 1)private T result;@JSONField(ordinal = 2)private T data;// 构造函数、getter、setter...
}@JSONType(typeKey = "type", orders = {@JSONType.Order(name = "pageList"), @JSONType.Order(name = "total")})
public class Page<T> {@JSONField(ordinal = 1)private List<T> pageList;@JSONField(ordinal = 2)private long total;// 构造函数、getter、setter...
}public class UserDto {// 字段...
}