相关的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. }  

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. }  


测试类如下:
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. }  


出现的异常如下
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了…………
posted on 2008-10-31 11:36 caihaibo 阅读(1637) 评论(2)  编辑  收藏 所属分类: json

评论:
# re: 主题:一个json-lib.jar转换复杂对象的问题? 2009-07-21 09:14 | ai4
如果我还有一个Employee类。
在TVO类的Map里还有一个List,而List里是放的就是Employee类,那应该怎样处理呢?
谢谢!  回复  更多评论
  
# re: 主题:一个json-lib.jar转换复杂对象的问题? 2009-07-21 09:15 | ai4
我说的是json转javabean时怎样处理?  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: