感谢大佬: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. 记录一次乱码问题修复经历!排查修复Poi-tl使用HttpServletResponse导出Word乱码问题

    问题 Poi-tl中HttpServletResponse导出Word乱码问题: 文件名使用中文,中文名乱码 导出的文件下载后乱码 原因 文件名中文乱码: 没有设置文件名的编码规则 文件下载乱码: 在 ...

  2. Layui 的内置jquery 版本

    //layui-v2.4.5 的内置jquery 版本. console.log(layui.$.fn.jquery);//=> 1.12.3 可以使用内置jq的方法: 方法一: layui.u ...

  3. Exchange ProxyLogon漏洞分析

    Exchange ProxyLogon漏洞分析 前言 续前文继续学习Exchange漏洞 Proxyshell 影响范围 Exchange Server 2019 < 15.02.0792.01 ...

  4. Spring Boot程序接收命令行参数

    Spring Boot程序接收命令行参数 输入一行,回车,触发一次.如果想要调用service层,也是可以,能调用service层,就可以做很多事,触发一次就好比调用了一次http接口一样 packa ...

  5. MySQL数据库安装Version5.5

    1.新建mysql用户 useradd -g hadoop -s /bin/bash -md /home/mysql mysql 创建.bash_profile,加载.bashrc 2.检查并且卸载系 ...

  6. 第10组 Beta冲刺 总结(组长)

    1.基本情况 组长博客链接:https://www.cnblogs.com/cpandbb/p/14050808.html 答辩总结: ·因为alpha阶段的产品做得偏离了方向,所以beta冲刺大家非 ...

  7. 设计模式-Java版-全-附代码-超生动实例

    阅读推荐:设计模式-简单篇 项目地址:https://gitee.com/zwtgit/gof23 学习网站推荐: https://refactoringguru.cn/design-patterns ...

  8. 局域网内部怎么安全接入U盘?

    准备工具: 内部专用U盘一个: 能连接外网的电脑(暂称"安全机")一个. 第一.安全机上安装360杀毒.360安全卫士或其它安全软件.并经常更新病毒库.木马库. 第二.外来U盘先通 ...

  9. Appium+python自动化测试过程中问题

    一.自动删除contactmanager 自动化测试appium提供的sample如下包/activity:com.example.android.contactmanager/.ContactMan ...

  10. TexStudio中Bibtex使用

    TexStudio中Bibtex使用 1.首先在百度文库中找到相应的参考文献: 2.建立bibfile.bib文件,放在和.tex同一目录下,将上面页面的结果考入该文件,注意其中第一行中的Tuan20 ...