net.sf.ezmorph.bean.MorphDynaBean cannot be cast to

在json字符串转java bean时,一般的对象,可以直接转,如:一个学生类,属性有姓名、年龄等

但是如果存在List集合就会出新net.sf.ezmorph.bean.MorphDynaBean cannot be cast to 错误。

解决方法:

  1. public class Student implements java.io.Serializable{
  2.         /**
  3.         * @Fields serialVersionUID : TODO
  4.         */
  5.         private static final long serialVersionUID = -1943961352036134112L;
  6.         private String sname;
  7.         private Integer age;
  8.         public String getSname() {
  9.                 return sname;
  10.         }
  11.         public void setSname(String sname) {
  12.                 this.sname = sname;
  13.         }
  14.         public Integer getAge() {
  15.                 return age;
  16.         }
  17.         public void setAge(Integer age) {
  18.                 this.age = age;
  19.         }
  20. }

由字符串转java bean时可以使用以下方法:

  1. JSONObject jobj = JSONObject.fromObject(str);
  2. Student s = (Student) JSONObject.tobean(jobj,Student.class);

是没有问题的,但是如果属性中含有复杂的类型,当其中属性有类似List , Map ,ArrayList、自定义的类型,如List<Teacher> teachers, 就不可以了。 会报错:MorphDynaBean cannot be cast to con.test……

在JSONObject.toBean的时候如果转换的类中有集合,可以先定义Map<String, Class> classMap = new HashMap<String, Class>();在classMap中put你要转换的类中的集合名,像:classMap.put("teachers", Teacher.class);然后在toBean()的时候把参数加上, 像:Student student=(Student) JSONObject.toBean(str, Student.class, classMap);

比如我定义了如下类型:

  1. import java.util.List;
  2. /**
  3. *
  4. * <P>Tiltle: AnalysisModel.java </P>
  5. * <P>Description:模型类  </P>
  6. * @author biyutong
  7. * @date Jun 11, 2012 9:37:54 AM
  8. * @version:V1.0
  9. */
  10. public class AnalysisModel implements java.io.Serializable{
  11.         /**
  12.          * 固定条件
  13.          */
  14.         private List<Condition> regularCondtionList;//
  15.         /**
  16.          * 动态条件
  17.          */
  18.         private List<ConditionField> dynamicConFieldList;
  19.         /**
  20.          * 结果
  21.          */
  22.         private List<ResultField> resultField;
  23.         /**
  24.          * 获取前多少条数据
  25.          */
  26.         private Integer topnum;
  27.         /**
  28.          * 顺序还是随机
  29.          */
  30.         private String sortFlag;
  31.         /**
  32.          * 备注
  33.          */
  34.         private String remark;
  35.         /**
  36.          * 模型名称
  37.          */
  38.         private String modelName;
  39.         /**
  40.          * 对应的xml文件名称
  41.          */
  42.         private String fileName;
  43.         public List<Condition> getRegularCondtionList() {
  44.                 return regularCondtionList;
  45.         }
  46.         public void setRegularCondtionList(List<Condition> regularCondtionList) {
  47.                 this.regularCondtionList = regularCondtionList;
  48.         }
  49.         public List<ConditionField> getDynamicConFieldList() {
  50.                 return dynamicConFieldList;
  51.         }
  52.         public void setDynamicConFieldList(List<ConditionField> dynamicConFieldList) {
  53.                 this.dynamicConFieldList = dynamicConFieldList;
  54.         }
  55.         public Integer getTopnum() {
  56.                 return topnum;
  57.         }
  58.         public void setTopnum(Integer topnum) {
  59.                 this.topnum = topnum;
  60.         }
  61.         public String getSortFlag() {
  62.                 return sortFlag;
  63.         }
  64.         public void setSortFlag(String sortFlag) {
  65.                 this.sortFlag = sortFlag;
  66.         }
  67.         public String getRemark() {
  68.                 return remark;
  69.         }
  70.         public void setRemark(String remark) {
  71.                 this.remark = remark;
  72.         }
  73.         public String getModelName() {
  74.                 return modelName;
  75.         }
  76.         public void setModelName(String modelName) {
  77.                 this.modelName = modelName;
  78.         }
  79.         public List<ResultField> getResultField() {
  80.                 return resultField;
  81.         }
  82.         public void setResultField(List<ResultField> resultField) {
  83.                 this.resultField = resultField;
  84.         }
  85.         public String getFileName() {
  86.                 return fileName;
  87.         }
  88.         public void setFileName(String fileName) {
  89.                 this.fileName = fileName;
  90.         }
  91. }

在转化的时候需要这样来写:

  1. Map<String, Class> classMap = new HashMap<String, Class>();
  2. classMap.put("regularCondtionList", Condition.class);
  3. classMap.put("dynamicConFieldList", ConditionField.class);
  4. classMap.put("resultField", ResultField.class);
  5. AnalysisModel analysisModel=(AnalysisModel) JSONObject.toBean(str, AnalysisModel.class, classMap);

 

来源:http://www.52itstyle.com/forum.php?mod=viewthread&tid=6001


如果给你带来帮助,欢迎微信或支付宝扫一扫,赞一下。