解决json转换问题:net.sf.ezmorph.beanMorphDynaBean cannotbe cast to xxx
Posted 请Java和Android开发者吃点干货
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决json转换问题:net.sf.ezmorph.beanMorphDynaBean cannotbe cast to xxx相关的知识,希望对你有一定的参考价值。
在操作json的数据格式的时候,如果没有指明数据类型,那么只能是基本类型或者是String类型,不能出现复杂数据类型。
for(Map<String, Object> map : datas){ String gw_id = map.get("GW_ID").toString();
gw_id = gw_id.substring(0, 14)+"1"+gw_id.substring(15); map.put("GW_ID", gw_id); map.put("UPDATE_TIME", new Date().getTime()); map.put("CREATE_TIME", map.get("CREATE_TIME")); map.put("LAST_COLLECT_TIME", map.get("LAST_COLLECT_TIME"));
Set<String> keys = map.keySet(); for(String key:keys){ if(null == map.get(key)){ map.put(key, "");
}
}
}String jsondata = JSONArray.fromObject(datas).toString();JSONArray jsonarray = JSONArray.fromObject(jsondata );
List<Map<String, Object>> objs = (List<Map<String, Object>>)JSONArray.toCollection(jsonarray, Map.class);
在这里,因为得到json字符串的时候用的是 JSONArray.fromObject(collenction),所有,在讲json字符串转换成json对象的时候,也只能用JSONArray.toCollection,并且,一定要带上后面的class参数。
将json字符串转换成对应的json对象以后,在遍历json对象时
for(Map<String, Object> data : objs)
data.get("LAST_COLLECT_NUM")
此时,get()方法得到的是对象,并且是只能转换成基本数据类型或者是String类型的,如果强制转化成复杂的类型,会提示这个错误。
再如:
Teacher类中,有三个属性。
private String teaId; private String teaName; private List<Student> stus;
Teacher teacher_1 = new Teacher("编号1", "教师1", stus); JSONObject obj = JSONObject.fromObject(teacher_1);
这一步,将Teacher 对象转换成json字符串的时候,没有任何的问题。
下面,将JSONObject 转换成Teacher 对象,如果,不加后面的class参数,也会报这儿错误。加了后,这一步也正常。
Teacher teacherBean = (Teacher) JSONObject.toBean(obj, Teacher.class);Student studentBean = teacherBean.getStus().get(0);
当从teacherBean 对象中取出stus属性的值时候,就会提示:
java.lang.ClassCastException:net.sf.ezmorph.bean.MorphDynaBean cannot be cast to com.edu.xukai.Student
用这种方式可以解决:
map.put("stus", Student.class);
Teacher teacherBean = (Teacher) JSONObject.toBean(obj, Teacher.class, map);
其中map对象是teacherBean对象中各个属性的类型,map额key是属性每次,value是属性的类型。
JSONArray.toArray(jsonArray, objectClass, classMap)JSONArray.toList(jsonArray, objectClass, classMap)
也支持这样的方式。
顺便贴一下我自己写的一个公共方法,后续再继续优化
/** * 封装返回参数 * @param requestBody * @param beanClass * @param <T> * @return * @throws IllegalAccessException * @throws InstantiationException */
public <T> T result(String requestBody, Class<T> beanClass, Map<String,Object> map) throws IllegalAccessException, InstantiationException {
T t = beanClass.newInstance(); JSONObject jsonObject = null; JSONArray jsonarr= null; if(null != requestBody){
jsonObject = JSONObject.fromObject(requestBody); if(jsonObject.has("status")){ if(jsonObject.getString("status").equalsIgnoreCase("0")){
jsonarr= jsonObject.getJSONArray("data"); if(jsonarr.size() > 0){ //json对象转换成java对象
if(null == map){
t = (T) JSONObject.toBean(jsonarr.getJSONObject(0),beanClass);
}else{
t = (T) JSONObject.toBean(jsonarr.getJSONObject(0),beanClass,map);
}
}
}else{
System.out.println("==================================================================获取返回失败信息=========》》》》》》"+jsonObject.getString("msg")); return t;
}
}else{
System.out.println("==================================================================获取返回失败信息=========》》》》》》"+requestBody); return null; //jsonObject= JSONObject.fromObject(requestBody);
//json对象转换成java对象
//t = (T) JSONObject.toBean(jsonObject,beanClass);
//jsonarr= JSONArray.fromObject(requestBody);
//json对象转换成java对象
//t = (T) JSONObject.toBean(jsonarr.getJSONObject(0),beanClass);
}
} return t;
}
阅读全文请点击下面的阅读原文
以上是关于解决json转换问题:net.sf.ezmorph.beanMorphDynaBean cannotbe cast to xxx的主要内容,如果未能解决你的问题,请参考以下文章
使用json时为啥转不了net.sf.ezmorph.bean.morphdynabean cannot be cast to ja
json教程系列-json错误解析net.sf.ezmorph.bean.MorphDynaBean cannot be cast to