fastjson带有泛型信息的序列化方法

​ 在我们处理网络请求的时候,会需要对网络请求返回的数据序列化成我们自己的对象,这时候带有泛型信息的序列化就尤为重要了


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();

猜你喜欢

转载自blog.csdn.net/lvqinglou/article/details/113242774