json解析出現:java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to XXX


感謝大佬:https://blog.csdn.net/one_ink/article/details/99817676

一、出錯原因

當我們利用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異常的解決方案

  1. 新建一個map對象
  2. 以list集合的名稱作為key,list集合里面的對象的Class作為value存入到map對象里面
  3. 在將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集合的對象比較困難,需要具體情況具體分析,以下是我的解決思路:

  1. 通過json對象的getJSONObject方法獲得需要被轉化為map集合的json對象
  2. 建立一個方法parseJSON2Map,將上一步獲得的json對象轉為map對象
  3. 將第二步轉化好的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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM