在我们处理网络请求的时候,会需要对网络请求返回的数据序列化成我们自己的对象,这时候带有泛型信息的序列化就尤为重要了
1 简单的网络请求示例
我这里使用的是okhttp库用于调用网络请求(okhttp简直是最好用的java网络请求库,我要吹爆他),代码调用如下
Response response = OkHttpUtil.getInstance().postWithJson(domainUrl, body);
try {
if (response.isSuccessful() && response.body() != null) {
JSONObject resJson = JSON.parseObject(response.body().string());
// 或者直接拿返回的字符串数据
// String resultStr = response.body().string();
log.info("网络请求内容{}", resJson)
}
} catch (Exception e) {
log.error("调用接口失败 请求参数 = " + aikucunProductShareRequest, e);
}
经过上面的代码,我们就可以拿到一个网络请求的字符串了,但是对字符串的处理是很蛋疼的,所以要转变成一个java对象去处理。
比方说,用以下一个通用的对象格式去接收
@Data
public class AikucunResponse<T> {
private String code;
private T data;
private Boolean success;
private String message;
}
2 带泛型的json对象转换
上述的返回结构也是我们平时很常用的结构,data中的值,每个接口的返回是不一样的,这时候在转换对象的时候如果直接用这样的方式去接收,当取对象的时候,会报类型转换的错误,因为这样做,fastjson拿不到具体的泛型信息,就会将data转换成一个jsonObject对象。
AikucunResponse<AikucunItem> aikucunResponse = resJson.toJavaObject(aikucunResponse.getClass());
// 这个方法一调就会报错
aikucunResponse.getData();
幸运的是,fastjson也提供了相应的支持,也就是TypeReference
AikucunResponse<AikucunItem> aikucunResponse = resJson.toJavaObject(new TypeReference<AikucunResponse<AikucunItem>>(){
});
// 这时候就会正常了
aikucunResponse.getData();
如果是解析字符串,那就是以下方法
AikucunResponse<AikucunItem> aikucunResponse = JSONObject.parseObject(resultStr, new TypeReference<AikucunResponse<AikucunItem>>(){
});
// 这时候就会正常了
aikucunResponse.getData();