FastJson带泛型转换时,JSON.parseObject后⾯的newTypeRefe。。。
在⽤FastJson做类型转换时,尤其是泛型操作时,会⽤到JSON.parseObject,如下所⽰:
Map<String, Object> objectMap = JSON.parseObject(responseStr,new TypeReference<Map<String, Object>>(){});
那么它末尾为什么有个花括号呢,我们可以直接看TypeReference的源码
public class TypeReference<T>{
private final Type type;
protected TypeReference(){
Type superClass =getClass().getGenericSuperclass();
type =((ParameterizedType) superClass).getActualTypeArguments()[0];
}
public Type getType(){
return type;
}
public final static Type LIST_STRING =new TypeReference<List<String>>(){}.getType();
}fastjson怎么用
可以看到它的构造⽅法是被protected修饰的,它的⼤概意思有:
1. 同⼀个包下,可以进⾏基本的操作,并⽆⼤碍(这⾥不是重点)
2. ⾮同⼀个包下,该类的⼦类可以继承protected修饰的⽅法或字段,如果不是⼦类就不⾏
所以回过头看TypeReference源码,它的构造⽅法被protected修饰,且我们写业务的类和它不在同⼀个包下。所以我们在具体写代码时遇到的真正问题是:业务代码和TypeReference不在同⼀个包下,且不是其⼦类,所以当我们直接⽤
TypeReference<Map<String, Object>> tr =new TypeReference<Map<String, Object>>();
是会报错的(因为不在同⼀个包,不是其⼦类,初始化时⽆法使⽤其protected修饰的构造⽅法)
那么这时候怎么办呢?我们可以再建⼀个类,让它继承TypeReference类,在这个类⾥我们什么都不做就可以,然后想使
⽤TypeReference时,就⽤我们建的这个类代替。
新建个类:
import com.alibaba.fastjson.TypeReference;
/**
* @ClassName TypeTestChild
* @Description TODO
* @Author GuoTianchi
* @Date 2020/10/23 8:41
* @Version V1.0.0
*/
public class TypeTestChild<T>extends TypeReference<T>{
}
当我们写代码时,就可以这么写:
Map<String, Object> objectMapTest = JSON.parseObject(responseStr,new TypeTestChild<Map<String, Object>>());
这时我们就明⽩最初的问题了,
Map<String, Object> objectMap = JSON.parseObject(responseStr,new TypeReference<Map<String, Object>>(){});
这⾥的花括号实际上是⼀个匿名内部类?!也就是我们⽤很懒的⽅式创建了⼀个⼦类去继承TypeReference,这样就省去了真正新建⼀个类的繁琐!因为是⼦类,那么它就可以使⽤⽗类的protected⽅法对⾃⼰进⾏构造啦。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。