天天看點

JSON字元串轉javabean,MorphDynaBean cannot be cast to ……

 在json字元串轉java bean時,一般的對象,可以直接轉,如:一個學生類,屬性有姓名、年齡等

Java代碼  

JSON字元串轉javabean,MorphDynaBean cannot be cast to ……
  1. public class Student implements java.io.Serializable{  
  2.     private static final long serialVersionUID = -1943961352036134112L;  
  3.     private String sname;  
  4.     private Integer age;  
  5.     public String getSname() {  
  6.         return sname;  
  7.     }  
  8.     public void setSname(String sname) {  
  9.         this.sname = sname;  
  10.     }  
  11.     public Integer getAge() {  
  12.         return age;  
  13.     }  
  14.     public void setAge(Integer age) {  
  15.         this.age = age;  
  16.     }  
  17. }  

  由字元串轉java bean時可以使用以下方法:

Java代碼  

JSON字元串轉javabean,MorphDynaBean cannot be cast to ……
  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);

比如我定義了如下類型:

Java代碼  

JSON字元串轉javabean,MorphDynaBean cannot be cast to ……
  1. import java.util.List;  
  2. public class AnalysisModel implements java.io.Serializable{  
  3.     private List<Condition> regularCondtionList;//  
  4.     private List<ConditionField> dynamicConFieldList;  
  5.     private List<ResultField> resultField;  
  6.     private Integer topnum;  
  7.     private String sortFlag;  
  8.     private String remark;  
  9.     private String modelName;  
  10.     private String fileName;  
  11.     public List<Condition> getRegularCondtionList() {  
  12.         return regularCondtionList;  
  13.     }  
  14.     public void setRegularCondtionList(List<Condition> regularCondtionList) {  
  15.         this.regularCondtionList = regularCondtionList;  
  16.     }  
  17.     public List<ConditionField> getDynamicConFieldList() {  
  18.         return dynamicConFieldList;  
  19.     }  
  20.     public void setDynamicConFieldList(List<ConditionField> dynamicConFieldList) {  
  21.         this.dynamicConFieldList = dynamicConFieldList;  
  22.     }  
  23.     public Integer getTopnum() {  
  24.         return topnum;  
  25.     }  
  26.     public void setTopnum(Integer topnum) {  
  27.         this.topnum = topnum;  
  28.     }  
  29.     public String getSortFlag() {  
  30.         return sortFlag;  
  31.     }  
  32.     public void setSortFlag(String sortFlag) {  
  33.         this.sortFlag = sortFlag;  
  34.     }  
  35.     public String getRemark() {  
  36.         return remark;  
  37.     }  
  38.     public void setRemark(String remark) {  
  39.         this.remark = remark;  
  40.     }  
  41.     public String getModelName() {  
  42.         return modelName;  
  43.     }  
  44.     public void setModelName(String modelName) {  
  45.         this.modelName = modelName;  
  46.     }  
  47.     public List<ResultField> getResultField() {  
  48.         return resultField;  
  49.     }  
  50.     public void setResultField(List<ResultField> resultField) {  
  51.         this.resultField = resultField;  
  52.     }  
  53.     public String getFileName() {  
  54.         return fileName;  
  55.     }  
  56.     public void setFileName(String fileName) {  
  57.         this.fileName = fileName;  
  58.     }  
  59. }  

 在轉化的時候需要這樣來寫:

Java代碼  

JSON字元串轉javabean,MorphDynaBean cannot be cast to ……
  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);