json解析出现:java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to XXX
一、出错原因
当我们利用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;
}
json解析出现:java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to XXX的更多相关文章
- 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 ...
- json 字符串包含数组转换为object对象是报异常java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to
前台传到后台的json字符串 前台实现这种格式json字符串方式: function contentFun(){ respType = respTypeFun(); return "{\&q ...
- 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, 查询出来的 ...
- 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 这种错误非常常见, ...
- JSON字符串转JavaBean,net.sf.ezmorph.bean.MorphDynaBean cannot be cast to ……
在json字符串转java bean时,一般的对象,可以直接转,如:一个学生类,属性有姓名.年龄等 public class Student implements java.io.Serializab ...
- 【明哥报错簿】之json转换报错---net.sf.ezmorph.bean.MorphDynaBean cannot be cast to XXXDO
简单的json和bean转换直接用: public static void main(String[] args) { String s = "{'request': [{'orderCod ...
- net.sf.ezmorph.bean.MorphDynaBean cannot be cast to java.util.Map
public static void main(String[] arg0) { String reString = "{" + "\"code\": ...
- Java中使用json时java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher问题解决
下面代码: public static void main(String[] args) { JSONObject obj = new JSONObject(); obj.put("msg& ...
- Caused by: java.lang.ClassNotFoundException: net.sf.ezmorph.Morpher
1.错误描述 Exception in thread "main" java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher a ...
随机推荐
- 安装并配置 Android Studio 开发工具和 Genymotion 模拟器
需求说明: 安装并配置 Android Studio 开发工具和 Genymotion 模拟器. 熟练使用 Genymotion 模拟器,掌握 Genymotion 模拟器的基本设置和程序安装. 实现 ...
- emqx的acl.conf使用
allow_anonymous=true就不说了,打开这个就像开了挂 现在讨论一下allow_anonymous=false,这样的话你会发现,client连接不上了 后来发现连接和权限 是两个事.. ...
- 2 - 基于ELK的ElasticSearch 7.8.x技术整理 - java操作篇 - 更新完毕
3.java操作ES篇 3.1.摸索java链接ES的流程 自行创建一个maven项目 3.1.1.依赖管理 点击查看代码 <properties> <ES-version>7 ...
- Go项目开源规范
我们为什么一定要知道开源规范呢? 一是,开源项目在代码质量.代码规范.文档等方面,要比非开源项目要求更高,在项目开发中按照开源项目的要求来规范自己的项目,可以更好地驱动项目质量的提高: 二是,一些大公 ...
- HITsz 数据库笔记
这是 HITsz 数据库笔记,欢迎到我的 GitHub 上查看,有笔记说明和源码,作业和实验报告,希望对你有帮助 博客园显示图片异常 数据库基本概念 数据抽象 通过抽象来对用户屏蔽复杂性,以简化用户与 ...
- Lucene8.5.x全文检索工具
本文的资源展示: hotword:是热词的文本,比如不是词语的中文,但是是什么人名或者公司名称的词语,需要分词成一个词语的将需要的加入hotword.dic stopword:无意义的词放入的词典,或 ...
- 为什么char类型输入遇空格会结束,int类型必须要空格才能输出
char类型与int类型输入时的区别: 在C语言的规则中,规定了scanf函数在接收字符串时--遇到空格或回车就认为前面的输入已经完成且有效! 而对于int类型:表示整数,输入时需要用空格隔开,以确认 ...
- 【vps】Centos 7安装python3.8.5
[vps]Centos 7安装python3.8.5 前言 由于服务器的搬迁,从香港搬到了大陆,原来的香港服务器即将到期,所以趁着大陆服务器在备案的时候,将新服务器的配置先配置一下.这篇文章就是分享C ...
- Go环境配置和GoModule
Linux相关 Linux常用操作 mkdir directory --创建文件夹 vi file --创建文件,再关闭vim rm file --删除文件 rm -rf directory --递归 ...
- Java加减乘除计算器实现
加减乘除计算机的实现 public static void main(String[] args) { while(true) { System.out.println("依次输入要计算的2 ...