解决json转换问题:net.sf.ezmorph.bean.MorphDynaBean cannotbe cast to xxx

简介: 解决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;
    }
相关文章
|
3月前
|
JSON 开发框架 API
【推荐100个unity插件之20】一个强大的JSON处理库——Newtonsoft.Json(也称为Json.NET)
【推荐100个unity插件之20】一个强大的JSON处理库——Newtonsoft.Json(也称为Json.NET)
192 0
|
3月前
|
JSON 数据格式 微服务
.NET下 支持大小写不敏感的JSON Schema验证方法
有很多应用程序在验证JSON数据的时候用到了JSON Schema。 在微服务架构下,有时候各个微服务由于各种历史原因,它们所生成的数据对JSON Object属性名的大小写规则可能并不统一,它们需要消费的JSON数据的属性名可能需要大小写无关。 遗憾的是,目前的JSON Schema没有这方面的标准,标准中都是大小写敏感的。在类似上述情况下,这给使用JSON Schema进行数据验证造成了困难。
|
SQL JSON 开发框架
.NET 中的 Json 使用体验
本文主要总结介绍.NET 中的对 Json 数据使用在使用过程中的关于编码、循环引用、时间格式化的一些问题
167 0
.NET 中的 Json 使用体验
|
存储 JSON JavaScript
.NET MVC第九章、Web Api Json序列化与反序列化
.NET MVC第九章、Web Api Json序列化与反序列化
197 0
.NET MVC第九章、Web Api Json序列化与反序列化
|
JSON 数据格式
【.NET开发福音】使用Visual Studio将JSON格式数据自动转化为对应的类
【.NET开发福音】使用Visual Studio将JSON格式数据自动转化为对应的类
557 0
【.NET开发福音】使用Visual Studio将JSON格式数据自动转化为对应的类
|
JSON 数据格式
将JSON字符串反序列化为指定的.NET对象类型
将JSON字符串反序列化为指定的.NET对象类型
161 0
|
JSON 前端开发 数据格式
.net MVC 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 maxJsonLength 属性设置的值
在.net mvc的controller中,方法返回JsonResult,一般我们这么写: [HttpPost] public JsonResult QueryFeature(string url, string whereClause) { string str=""; return Json(str); }   此时如果str过长,就会报“使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 maxJsonLength 属性设置的值”。
2912 0
|
JSON JavaScript API
.NET6东西--可写的JSON DOM API
.NET6东西--可写的JSON DOM API
275 0
|
JSON .NET 数据格式
2.1命令行和JSON的配置「深入浅出ASP.NET Core系列」
原文:2.1命令行和JSON的配置「深入浅出ASP.NET Core系列」 希望给你3-5分钟的碎片化学习,可能是坐地铁、等公交,积少成多,水滴石穿,谢谢关注。 命令行配置  1.新建控制台项目  2.
1154 0
|
JSON .NET 数据格式
2.1命令行和JSON的配置「深入浅出ASP.NET Core系列」
希望给你3-5分钟的碎片化学习,可能是坐地铁、等公交,积少成多,水滴石穿,谢谢关注。 命令行配置  1.新建控制台项目  2.nuget引入microsoft.aspnetcore.all  这里要注意版本号必须和dotnetcore兼容 3.
803 0