您的位置:首页 > Web前端 > JavaScript

fastJson泛型如何转换

2016-11-29 23:29 387 查看

引子

  现在负责的业务和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);
}


p.p1{margin:0.0px0.0px0.0px0.0px;font:14.0pxMonaco}
p.p2{margin:0.0px0.0px0.0px0.0px;font:14.0pxMonaco;color:#ff2600}
span.s1{text-decoration:underline;color:#0433ff}
span.Apple-tab-span{white-space:pre}


结果:

{"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>>(){});


p.p1{margin:0.0px0.0px0.0px0.0px;font:14.0pxMonaco;color:#0433ff}
span.s1{text-decoration:underline}
span.s2{color:#ff2600}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: