处理泛型反序列化-fastjson-TypeReference

1. 基础使用

在fastjson中提供了一个用于处理泛型反序列化的类TypeReference。

import com.alibaba.fastjson.TypeReference;

List<VO> list = JSON.parseObject("...", new TypeReference<List<VO>>() {});

如下写法有更好的性能

import com.alibaba.fastjson.TypeReference;

final static Type type = new TypeReference<List<VO>>() {}.getType();

List<VO> list = JSON.parseObject("...", type);

在这里例子中,通过TypeReference能够解决List中T的类型问题。

2. 带参数使用

在1.2.9 & 1.1.49.android版本中,TypeReference支持泛型参数,方便一些框架实现通用的反序列化类。用法如下:

2.1. 单参数例子

public class Response<T> {
     public T data;
}
public static <T> Response<T> parseToMap(String json, Class<T> type) {
     return JSON.parseObject(json, 
                            new TypeReference<Response<T>>(type) {});
}

2.2. 双参数例子

public static <K, V> Map<K, V> parseToMap(String json, 
                                            Class<K> keyType, 
                                            Class<V> valueType) {
     return JSON.parseObject(json, 
                            new TypeReference<Map<K, V>>(keyType, valueType) {
                            });
}
// 可以这样使用
String json = "{1:{name:\"ddd\"},2:{name:\"zzz\"}}";
Map<Integer, Model> map = parseToMap(json, Integer.class, Model.class);
assertEquals("ddd", map.get(1).name);
assertEquals("zzz", map.get(2).name);

实际更复杂的场景举例 多层级范型,范型类型一致

定义一个泛型对象

@Data
public final class ServiceResponse<T> implements Serializable {

	/*  */
	private static final long serialVersionUID = 2425960131861679422L;
	@ApiModelProperty(name = "code", value = "响应Code", required = true, example = "0")
	private String code;
	@ApiModelProperty(name = "msg", value = "错误信息", required = true, example = "")
	private String msg;
	@ApiModelProperty(name = "detail", value = "错误信息详细", required = true, example = "")
	private String detail;
	@ApiModelProperty(name = "result", value = "响应数据", required = true, example = "")
	private T result;
}

再定义一个实体类

@Data
public class TabVO<T> {
   
    private Integer pageSize;
   
    private Integer pageNo;
   
    private List<SubTabVO<T>> subTabVOList;
   
    private List<T> dataVOList;

}

再定义一个实体类

@Data
public class SubTabVO<T> implements Serializable {

    private List<T> dataVOList;

}

可以这样使用 T范型用TVO类型的实体代表

ServiceResponse<List<TabVO<TVO>>> response = JSON.parseObject(jsonStr, new TypeReference<ServiceResponse<List<TabVO<TVO>>>>() {
                    });

Gson的TypeToken类似

ServiceResponse<List<TabVO<TVO>>> response = gson.fromJson(homeDegradeJson, new TypeToken<ServiceResponse<List<TabVO<TVO>>>>() {}.getType());

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值