感谢大佬: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. 【优雅代码】03-optional杜绝空指针异常

    [优雅代码]03-optional杜绝空指针异常 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有帮助到你的话请顺 ...

  2. MySQL高级查询与编程作业目录 (作业笔记)

    MySQL高级查询与编程笔记 • [目录] 第1章 数据库设计原理与实战 >>> 第2章 数据定义和操作 >>> 2.1.4 使用 DDL 语句分别创建仓库表.供应 ...

  3. Java程序设计基础笔记 • 【第3章 运算符与表达式】

    全部章节   >>>> 本章目录 3.1 运算符(一) 3.1.1 赋值运算符 3.1.2 算数运算符 3.1.3 复合运算符 3.1.4 实践练习(一) 3.1.5 实践练习 ...

  4. 「影院售票系统」 · Java Swing + MySQL JDBC开发

    目录 文档说明: 一.语言和环境 二.实现功能 三.数据库设计 四.具体要求及推荐实现步骤 五.注意事项 六.评分标准 实现代码: 一.数据库: 二.Java Swing: com.ynavc.Bea ...

  5. Mysql 设计超市经营管理系统,包括员工库存表(stock) 和 仓库表(warehouse)

    互联网技术学院周测机试题(三) 一.需求分析 为进一步完善连锁超市经营管理,提高管理效率,减少管理成本,决定开发一套商品管理系统,用于日常的管理.本系统分为商品管理.员工管理.店铺管理,库存管理等功能 ...

  6. docker学习:docker---centos安装

    查看目标镜像 docker search centos 拉取镜像 docker pull centos 查看镜像 docker images 启动镜像 docker run -itd --privil ...

  7. [学习笔记] Oracle基础增删改查用法

    查询 select *|列名|表达式 from 表名 where 条件 order by 列名 select t.* from STUDENT.STUINFO t where t.stuname = ...

  8. MySQL 截取小数位数

    项目中遇到一些有关小数位数截取的问题,留下痕迹,以便后续使用时注意:个人推荐使用方法2),直接四舍五入 1)select FORMAT(1478568.2457,2): 查询出来的结果为: ,每隔3位 ...

  9. 怎样修改自己的登录shell

    问题 我只是Linux系统的普通用户,没有权限调用chsh命令修改自己的登录shell. bash-4.1$ chsh --help Usage: chsh [ -s shell ] [ --list ...

  10. spring cloud --- config 配置中心 [本地、git获取配置文件]

    spring boot      1.5.9.RELEASE spring cloud    Dalston.SR1 1.前言 spring cloud config 配置中心是什么? 为了统一管理配 ...