一、出錯原因
當我們利用json解析中的toBean方法時,如果它的屬性里面包含復雜對象,那么在我們調用這個復雜對象時就會出現這個錯誤:java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to XXX
二、出錯場景
student類,里面有姓名、性別和年齡三個屬性和它們對應的get、set方法:
public class Student {
private String stuName;
private String sex;
private Integer age;
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
Teacher類,里面有教師姓名、Student、list集合的Student、map集合的Student
public class Teacher {
private String teaName;
private Student stu;
private List<Student> stuList;
private Map<String, Student> stuMap;
public String getTeaName() {
return teaName;
}
public void setTeaName(String teaName) {
this.teaName = teaName;
}
public Student getStu() {
return stu;
}
public void setStu(Student stu) {
this.stu = stu;
}
public List<Student> getStuList() {
return stuList;
}
public void setStuList(List<Student> stuList) {
this.stuList = stuList;
}
public Map<String, Student> getStuMap() {
return stuMap;
}
public void setStuMap(Map<String, Student> stuMap) {
this.stuMap = stuMap;
}
}
測試用的json字符串
{
"teaName":"老王",
"stu":{
"stuName":"張三",
"sex":"男",
"age":18
},
"stuList":[
{
"stuName":"李四",
"sex":"男",
"age":18
},
{
"stuName":"王五",
"sex":"男",
"age":18
}
],
"stuMap":{
"小明":{
"stuName":"小明",
"sex":"男",
"age":18
},
"小紅":{
"stuName":"小紅",
"sex":"nü",
"age":18
}
}
}
測試用例,其中的jsonStr使用上面的json字符串:
public class JsonParsingTest {
private final static String jsonStr = "";
public static void main(String[] args) {
JSONObject jsonObj = JSONObject.fromObject(jsonStr);
Teacher teacher = (Teacher)JSONObject.toBean(jsonObj, Teacher.class);
testStu(teacher.getStu());
testListStu(teacher.getStuList());
testMapStu(teacher.getStuMap());
}
private static void testStu(Student stu) {//正常運行
System.out.println(stu.getStuName());
}
private static void testListStu(List<Student> stuList) {//出現ClassCastException異常
for(Student stu : stuList) {
System.out.println(stu.getStuName());
}
}
private static void testMapStu(Map<String, Student> stuMap) {//出現ClassCastException
for(String key : stuMap.keySet()) {
Student stu = stuMap.get(key);
System.out.println(stu.getStuName());
}
}
}
三、解決方案
一、json轉化為帶有list集合的復雜對象時出現的ClassCastException異常的解決方案
- 新建一個map對象
- 以list集合的名稱作為key,list集合里面的對象的Class作為value存入到map對象里面
- 在將json對象轉化為javaBean對象時將新建的map作為最后一個參數傳入到toBean方法里面
示例代碼如下:
Map<String, Class<?>> classMap = new HashMap<String, Class<?>>();
classMap.put("stuList", Student.class);
Teacher teacher = (Teacher)JSONObject.toBean(jsonObj, Teacher.class, classMap);
二、json轉化為帶有map集合的復雜對象時出現的ClassCastException異常的解決方案
ps.將json對象轉為包含復雜map集合的對象比較困難,需要具體情況具體分析,以下是我的解決思路:
- 通過json對象的getJSONObject方法獲得需要被轉化為map集合的json對象
- 建立一個方法parseJSON2Map,將上一步獲得的json對象轉為map對象
- 將第二步轉化好的map對象set進最開始轉化好的javaBean對象中
示例代碼如下:
JSONObject jsonObj = JSONObject.fromObject(jsonStr);
Teacher teacher = (Teacher)JSONObject.toBean(jsonObj, Teacher.class);
Map<String, Student> stuMap = parseJSON2Map(jsonObj.getJSONObject("stuMap"));
teacher.setStuMap(stuMap);
將json對象轉為map對象方法代碼:
Map<String, Student> parseJSON2Map(JSONObject json) {
Map<String, Student> tables = new HashMap<String, Student>();
Map<String, Class<?>> classMap = new HashMap<String, Class<?>>();
for(Object key: json.keySet()) {
JSONObject value = json.getJSONObject(key.toString());
Student table = (Student)JSONObject.toBean(value, Student.class, classMap);
tables.put(key.toString(), table);
}
return tables;
}