主题:一个json-lib.jar转换复杂对象的问题?

主题:一个json-lib.jar转换复杂对象的问题?
相关的bean如下
TVO.java代码如下
Java代码 复制代码
  1. package demo;  
  2.   
  3. import java.util.*;  
  4.   
  5. import com.easylotto.lottobar.bean.BaseEntity;  
  6. import com.easylotto.lottobar.bean.ReqCommandVO;  
  7.   
  8. public class TVO extends BaseEntity{  
  9.     private String tname;  
  10.     private List<Person> rcvoList;  
  11.     private Map map;  
  12.       
  13.     public List<Person> getRcvoList() {  
  14.         return rcvoList;  
  15.     }  
  16.   
  17.     public void setRcvoList(List<Person> rcvoList) {  
  18.         this.rcvoList = rcvoList;  
  19.     }  
  20.   
  21.     public String getTname() {  
  22.         return tname;  
  23.     }  
  24.   
  25.     public void setTname(String tname) {  
  26.         this.tname = tname;  
  27.     }  
  28.       
  29.   
  30.     public Map getMap() {  
  31.         return map;  
  32.     }  
  33.   
  34.     public void setMap(Map map) {  
  35.         this.map = map;  
  36.     }  
  37.   
  38.     /** 
  39.      * @param args 
  40.      */  
  41.     public static void main(String[] args) {  
  42.         // TODO Auto-generated method stub  
  43.   
  44.     }  
  45.   
  46. }  
package demo;
import java.util.*;
import com.easylotto.lottobar.bean.BaseEntity;
import com.easylotto.lottobar.bean.ReqCommandVO;
public class TVO extends BaseEntity{
private String tname;
private List<Person> rcvoList;
private Map map;
public List<Person> getRcvoList() {
return rcvoList;
}
public void setRcvoList(List<Person> rcvoList) {
this.rcvoList = rcvoList;
}
public String getTname() {
return tname;
}
public void setTname(String tname) {
this.tname = tname;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}

Person.java如下
Java代码 复制代码
  1. package demo;  
  2.   
  3. public class Person {  
  4.     private String name;  
  5.     private String age;  
  6.       
  7.     public Person(String name,String age){  
  8.         this.name=name;  
  9.         this.age=age;  
  10.     }  
  11.     public String getAge() {  
  12.         return age;  
  13.     }  
  14.     public void setAge(String age) {  
  15.         this.age = age;  
  16.     }  
  17.     public String getName() {  
  18.         return name;  
  19.     }  
  20.     public void setName(String name) {  
  21.         this.name = name;  
  22.     }  
  23.       
  24. }  
package demo;
public class Person {
private String name;
private String age;
public Person(String name,String age){
this.name=name;
this.age=age;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}


测试类如下:
Java代码 复制代码
  1. package demo;  
  2.   
  3. import net.sf.json.*;  
  4. import java.util.*;  
  5.   
  6. import com.easylotto.lottobar.bean.ReqCommandVO;  
  7. import com.easylotto.lottobar.bean.SocketCommandEntity;  
  8.   
  9. /** 
  10.  * Json使用测试类 
  11.  * @author peidw  
  12.  * 
  13.  */  
  14. public class JsonDemo {  
  15.       
  16.     public String JsonStr2Object(){  
  17.         String str="{'map':{'a2':'A2','a1':'A1'},'rcvoList':[{'age':'20','name':'小裴'},{'age':'58','name':'小庞'}],'tname':'xxname'}";  
  18.         JSONObject jo=JSONObject.fromObject(str);  
  19.         TVO sce=null;  
  20.         if(jo!=null){  
  21.             sce=(TVO)jo.toBean(jo, TVO.class);  
  22.             List alist=sce.getRcvoList();  
  23.             System.out.println(alist.size());  
  24.             Person rcvo=null;  
  25.             for(int i=0;i<alist.size();i++){  
  26.                 rcvo=(Person)alist.get(i);  
  27.                 System.out.print(rcvo.getName()+"-"+rcvo.getAge());  
  28.             }  
  29.         }  
  30.   
  31.   
  32.         return "测试";  
  33.     }  
  34.       
  35.     public void Object2JsonStr(){  
  36.   
  37.         TVO tvo=new TVO();  
  38.         tvo.setTname("xxname");  
  39.         List <Person>a=new ArrayList();  
  40.         a.add(new Person("小裴","20"));  
  41.         a.add(new Person("小庞","58"));  
  42.         tvo.setRcvoList(a);  
  43.         Map map=new HashMap();  
  44.         map.put("a1", "A1");  
  45.         map.put("a2", "A2");  
  46.         tvo.setMap(map);  
  47.         JSONObject jo=JSONObject.fromObject(tvo);  
  48.         System.out.println(jo);  
  49.     }  
  50.       
  51.     public static void main(String[] args){  
  52.         JsonDemo jd=new JsonDemo();  
  53.         jd.JsonStr2Object();  
  54.         //jd.Object2JsonStr();  
  55.     }  
  56. }  
package demo;
import net.sf.json.*;
import java.util.*;
import com.easylotto.lottobar.bean.ReqCommandVO;
import com.easylotto.lottobar.bean.SocketCommandEntity;
/**
* Json使用测试类
* @author peidw
*
*/
public class JsonDemo {
public String JsonStr2Object(){
String str="{'map':{'a2':'A2','a1':'A1'},'rcvoList':[{'age':'20','name':'小裴'},{'age':'58','name':'小庞'}],'tname':'xxname'}";
JSONObject jo=JSONObject.fromObject(str);
TVO sce=null;
if(jo!=null){
sce=(TVO)jo.toBean(jo, TVO.class);
List alist=sce.getRcvoList();
System.out.println(alist.size());
Person rcvo=null;
for(int i=0;i<alist.size();i++){
rcvo=(Person)alist.get(i);
System.out.print(rcvo.getName()+"-"+rcvo.getAge());
}
}
return "测试";
}
public void Object2JsonStr(){
TVO tvo=new TVO();
tvo.setTname("xxname");
List <Person>a=new ArrayList();
a.add(new Person("小裴","20"));
a.add(new Person("小庞","58"));
tvo.setRcvoList(a);
Map map=new HashMap();
map.put("a1", "A1");
map.put("a2", "A2");
tvo.setMap(map);
JSONObject jo=JSONObject.fromObject(tvo);
System.out.println(jo);
}
public static void main(String[] args){
JsonDemo jd=new JsonDemo();
jd.JsonStr2Object();
//jd.Object2JsonStr();
}
}


出现的异常如下
2
Exception in thread "main" java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean
at demo.JsonDemo.JsonStr2Object(JsonDemo.java:26)
at demo.JsonDemo.main(JsonDemo.java:53)
使用的是json-lib-2.2.1-jdk15.jar包,请问这是怎么回事,怎么解决?


这个问题有两个地方值得考虑:
1、一个就是json-lib好像是使用反射实现的,那你的Person类如果没有无参数的构造方法的话,很危险;
2、在你的转化的代码上并没有告诉程序把rcvoList里的数据为何种类型

为此正确的做法是,为Person添加无参数的构造方法,同时修改代码为:

if(jo!=null){ 
             Map<String, Class> m = new HashMap<String, Class>();
             m.put("rcvoList", Person.class);
             sce=(TVO)JSONObject.toBean(jo, TVO.class, m);

这样应该就OK了…………

你可能感兴趣的:(主题:一个json-lib.jar转换复杂对象的问题?)