解決json轉換問題:net.sf.ezmorph.bean.MorphDynaBean 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;
}
最後更新:2017-09-23 17:32:46