感谢大佬: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;
}

json解析出现:java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to XXX的更多相关文章

  1. java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to

    Java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to 在使用JSONObject.toBe ...

  2. json 字符串包含数组转换为object对象是报异常java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to

    前台传到后台的json字符串 前台实现这种格式json字符串方式: function contentFun(){ respType = respTypeFun(); return "{\&q ...

  3. java.util.LinkedHashMap cannot be cast to xxx 和 net.sf.ezmorph.bean.MorphDynaBean cannot be cast to xxx

    java.util.LinkedHashMap cannot be cast to com.entity.Person 使用mybatis, resultMap映射的是实体类Person, 查询出来的 ...

  4. json学习系列(5)-json错误解析net.sf.ezmorph.bean.MorphDynaBean cannot be cast to

    最近在使用json的时候,报了下面的错误: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to java.lang.String 这种错误非常常见, ...

  5. JSON字符串转JavaBean,net.sf.ezmorph.bean.MorphDynaBean cannot be cast to ……

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

  6. 【明哥报错簿】之json转换报错---net.sf.ezmorph.bean.MorphDynaBean cannot be cast to XXXDO

    简单的json和bean转换直接用: public static void main(String[] args) { String s = "{'request': [{'orderCod ...

  7. net.sf.ezmorph.bean.MorphDynaBean cannot be cast to java.util.Map

    public static void main(String[] arg0) { String reString = "{" + "\"code\": ...

  8. Java中使用json时java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher问题解决

    下面代码: public static void main(String[] args) { JSONObject obj = new JSONObject(); obj.put("msg& ...

  9. Caused by: java.lang.ClassNotFoundException: net.sf.ezmorph.Morpher

    1.错误描述 Exception in thread "main" java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher a ...

随机推荐

  1. 物联网大赛 - Android学习笔记(一) Android概念

    一.Android 概念 Android是开放式的手机和电脑操作系统,是基于Linux系统做的上层开发. android可以做些什么? Android可以开发各种手机应用APP,也可以开发车载系统等, ...

  2. Unity——卡通渲染实现

    效果展示: 原模型: 一.简单分析 卡通渲染又叫非真实渲染(None-Physical Rendering-NPR),一般日漫里的卡通风格有几个特点: 1.人物有描边 2.有明显的阴影分界线,没有太平 ...

  3. STM32零基础入门教程

    本文主要是针对想了解STM32,手里又没有太多预算的小伙伴.市场上针对新手来说,比较合适的STM32开发版太贵,比如正点原子.树莓派等,便宜的教程又不详细,这对想白嫖的小伙伴来说不太有好,所以我选了一 ...

  4. Log4j2进阶使用(更多高级特性)

    1.高级进阶说明 本文介绍Log4j2高级进阶使用, 基于Log4j2进阶使用(按大小时间备份日志), 介绍更多的高级特性, 本文基于上文给出的完整log4j2.xml, 修改对应的配置项, 演示高级 ...

  5. Log4j2完整XML参考(详细注释说明)

    1.说明 本文提供完整的log4j2.xml配置文件, 供开发中参考使用,可以作为模板, 配置对应实现如下常用的功能: 1.自动检测和重新加载配置,每10分钟(600s)检测一次 2.每个日志文件最大 ...

  6. shell3-循环

    常用的循环语句有3种: <1>for <2>while <3>utile 1.for语句的格式: for 变量名 in 列表: do 循环体 done 如何生成列表 ...

  7. spring boot + thymeleaf +security自定义规则 的简单使用

    1.前言 以前开发一直使用 springMVC模式开发 ,前端页面常使用 JSP  ,现在html5淘汰了 ,要么使用html ,要么使用vue , 现在使用spring boot ,有必要总结一下 ...

  8. Word2010初识

    原文链接:https://www.toutiao.com/i6487370439910752782/ 认识Word Microsoft Office Word是微软公司的一个文字处理器应用软件. 启动 ...

  9. BootStrap 是什么东西?

    Bootstrap Bootstrap 能很快速搭建一整套页面.是最受欢迎的 HTML.CSS 和 JS 框架,用于开发响应式布局.移动设备优先的 WEB 项目.所有设备都可以适配.所有项目都适用.1 ...

  10. 【原创】阿里三面:搞透Kafka的存储架构,看这篇就够了

    阅读本文大约需要30分钟.这篇文章干货很多,希望你可以耐心读完. 你好, 我是华仔,在这个 1024 程序员特殊的节日里,又和大家见面了. 从这篇文章开始,我将对 Kafka 专项知识进行深度剖析, ...