最近在使用json的時候,報了下面的錯誤:
net.sf.ezmorph.bean.MorphDynaBean cannot be cast to java.lang.String
這種錯誤非常常見,因為json轉化為javabean的時候,默認為MorphDynaBean類的。如下面的例子:
在json字符串轉javabean時,一般的對象,可以直接轉,如:一個學生類,屬性有姓名、年齡等。
public class Student implements java.io.Serializable{ private static final long serialVersionUID = 1L; private String sname; private Integer age; public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
由字符串轉javabean時可以使用以下方法:
String str = "[{\"sname\":\"admin\",\"age\":20}]";
////接收{}對象,此處接收數組對象會有異常,故需要解決 if (str.indexOf("[") != -1) { str = str.replace("[", ""); } if (str.indexOf("]") != -1) { str = str.replace("]", ""); } JSONObject jobj = JSONObject.fromObject(str); Student s = (Student) JSONObject.toBean(jobj,Student.class);
這樣沒有問題的,但是如果屬性中含有復雜的類型,當其中屬性有類似List, Map,ArrayList就不可以了。 會報錯:MorphDynaBean cannot be cast to ******。在JSONObject.toBean的時候如果轉換的類中有集合,可以先定義Map classMap = new HashMap();在classMap中put你要轉換的類中的集合名,比如:classMap.put("teachers", Teacher.class);然后在toBean()的時候把參數加上,例如:Student student=(Student) JSONObject.toBean(str, Student.class, classMap);
下面舉出一個小小的例子:
public class Student implements java.io.Serializable{ private static final long serialVersionUID = 1L; private String sname; private Integer age; private List < String > courses; public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public List getCourses() { return courses; } public void setCourses(List courses) { this.courses = courses; } }
在轉化的時候需要這樣來寫:
Map classMap = new HashMap(); classMap.put("courses",String.class); Student student =( Student) JSONObject.toBean(str, Student.class, classMap);