解决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;
    }
时间: 2024-08-23 16:10:50

解决json转换问题:net.sf.ezmorph.bean.MorphDynaBean cannotbe cast to xxx的相关文章

json-lib net.sf.ezmorph.bean.MorphDynaBean cannot be cast to xxx

在使用json-lib 反序列化时,报错: Exception in thread "main" Java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to com.jn.json.bean.Student at com.jn.test.Test2.test_reserialize(Test2.java:104) at com.jn.test.Test2.main(Test2.jav

json转换问题

问题描述 碰到了一个json转换的问题,以下是测试代码:List list = new ArrayList(); list.add( "first" ); list.add( "second" ); JSONArray jsonArray2 = JSONArray.fromObject( list );程序执行到这行,JSONArray jsonArray2 = JSONArray.fromObject( list );老是报下面的错误,找了半天也没找到,该引用的包

json转换出现警告怎么去除

问题描述 下面是访问后台时json转换时出现的警告, 在网上搜索下, 很多人出现过这种情况, 没搜索到解决方案, 希望大家帮忙可以去除掉这些警告, 虽然不影响使用2011-8-19 10:20:11 net.sf.json.JSONObject defaultBeanProcessing信息: Property 'parent' of class com.huawei.ifree.autotest.log.analyse.platform.checkednode.CheckedTestSuite

解决json日期格式问题的3种方法_json

开发中有时候需要从服务器端返回json格式的数据,在后台代码中如果有DateTime类型的数据使用系统自带的工具类序列化后将得到一个很长的数字表示日期数据,如下所示: 复制代码 代码如下: //设置服务器响应的结果为纯文本格式            context.Response.ContentType = "text/plain";           //学生对象集合            List<Student> students = new List<St

php 中解决json中文乱码的函数

php教程自带了json_encode来处理json数据,那么它们对中文的支持不好,下面我们来看个实例 echo json_encode(array(123213,'中国')); {"platformid":"123213","userid":"1023","username":"u00b7u00f0u00b5u00b2u00c9u00b1u00b7u00f0u00ccu00fc"} 我

用 Rhino/Nashorn 代替第三方 JSON 转换库(第三版)

无须其他第三方包,只是依赖于 Java 自带的 JVM 自带的 Rhino/Nashorn 引擎提供 js/json 的服务.主要的两个类是 JsEngineWrapper.JsonHelper,它们的继承关系是 JsEngineWrapper 派生了 JsonHelper. 源码:http://git.oschina.net/sp42/ajaxjs/tree/master/ajaxjs-base/src/com/ajaxjs/js?dir=1&filepath=ajaxjs-base%2Fsr

C#将XML转换成JSON转换XML

原文:C#将XML转换成JSON转换XML using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using Newtonsoft.Json; namespace JSonConverter { class Program { static void Main(string[] args) { string xml = "<Test>

将json转换成struts参数的方法_javascript技巧

加入对象为{name:'tom','class':{className:'class1'},classMates:[{name:'lily'}]} struts2期待的格式是 name=tom&class.className=class1&classMates[0].name=lily function parseParam(param, key) { var paramStr = ""; if (param instanceof String || param ins

对象-js array and json 转换

问题描述 js array and json 转换 数组生成: f_level[f_level_amount] = '{"id":"' +menueObj.menueId +'",' +'"name"'+ ':"' + menueObj.menueName +'"}'; 效果图: 实际想要的效果:获得f_level对象,能让我遍历f_level[i].id.f_level[i].name获取 解决方案 直接存储对象就好了,你存