[转]fastjson泛型类转换
引子
现在负责的业务和json打交道比较多,最近使用fastJson框架json串转成泛型对象遇到了一个异常:
java.lang.ClassCastException
还原下场景:
模型Result<T>
复制代码
publicclassResult<T>{
privateStringmsg;
privateList<T>module;
publicStringgetMsg(){
returnmsg;
}
publicvoidsetMsg(Stringmsg){
this.msg=msg;
}
publicList<T>getModule(){
returnmodule;
}
publicvoidsetModule(List<T>module){
this.module=module;
}
}
复制代码
为什么要使用泛型,可以理解泛型可以接受任意类型,有些代码是公用的,如结果集,不可能为每个具体结果定义一个模型,比如Result<User>、Result<Item>等。
复制代码
publicclassUser{
privateLonguser_id;
privateStringuser_name;
publicUser(){
}
publicUser(LonguserId,Stringname){
this.user_id=userId;
this.user_name=name;
}
publicLonggetUser_id(){
returnuser_id;
}
publicvoidsetUser_id(Longuser_id){
this.user_id=user_id;
}
publicStringgetUser_name(){
returnuser_name;
}
publicvoidsetUser_name(Stringuser_name){
this.user_name=user_name;
}
}
复制代码
下面直接看下泛型的转换
复制代码
复制代码
publicstaticvoidmain(String[]args){
Result<User>r=newResult<User>();
r.setMsg("msg");
List<User>users=newArrayList<>();
users.add(newUser(1L,"hehe"));
users.add(newUser(2L,"haha"));
r.setModule(users);
Stringjs=JSON.toJSONString(r);
System.out.println(js);
Result<User>obj=(Result<User>)JSON.parseObject(js,Result.class);
Useruser=obj.getModule().get(0);
System.out.println(user);
}
复制代码
复制代码
复制代码
结果:
{"module":[{"user_id":1,"user_name":"hehe"},{"user_id":2,"user_name":"haha"}],"msg":"msg"}
Exceptioninthread"main"java.lang.ClassCastException:com.alibaba.fastjson.JSONObjectcannotbecasttocom.yuanmeng.json.User
atcom.yuanmeng.json.fanxing.Client.main(Client.java:32)
复制代码
采用fastjson框架的TypeReference即可将json串转成定义好的泛型对象
Result<User>obj=(Result<User>)JSON.parseObject(js,newTypeReference<Result<User>>(){});