zoukankan      html  css  js  c++  java
  • Fastjson转换json到带泛型的对象(如Map)报错解决

    1 问题出现

    在跑demo的时候,写了个读取json,然后转换成HashMap的代码,结果发现fastjson报了类型转换异常:

    private static HashMap<String,ErrorDto> errorCodeCache;
    
      static {
        String s = FileUtil.readResourceFile(ERROR_JSON_PATH);
        HashMap hashMap = JSON.parseObject(s, HashMap.class);
        errorCodeCache = hashMap;
    }
    

    异常信息:

    java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com.zgd.shop.core.error.ErrorDto
    at com.zgd.shop.core.error.ErrorCache.getMsg(ErrorCache.java:40) ~[classes/:na]
    at com.zgd.shop.core.result.ResultUtil.getResult(ResultUtil.java:89) ~[classes/:na]
    at com.zgd.shop.core.result.ResultUtil.failure(ResultUtil.java:71) ~[classes/:na]
    at com.zgd.shop.core.result.ResultUtil.failure(ResultUtil.java:50) ~[classes/:na]

    因为fastjson转换对象,方法是JSON.parseObject(String json,Class clazz),这个方法又没办法指定我们需要转换的具体类型

    比如我们想要得到的结果是HashMap<String,ErrorDto>, 但是因为parseObject没有指定泛型,所以

    通过debug,可以看到json解析后,是一个HashMap<String,JsonObject>类型
    在这里插入图片描述

    2. 解决

    fastjson除了上面的方法外,还重载了一个方法

    public static <T> T parseObject(String text, TypeReference<T> type, Feature... features){}
    

    就是这个TypeReference,修改后代码:

        HashMap<String,User> map = JSON.parseObject(s, new TypeReference<HashMap<String,User>>(){});
    
    // 自己写了一个测试类,由于需要接收公司另一个服务发送的消息进行消费,刚好用上
            ArrayList<Message> messages = new ArrayList<>();
            messages.add(new Message("1234","1"));
            messages.add(new Message("1235","2"));
            messages.add(new Message("1236","3"));
            messages.add(new Message("1237","4"));
            String jsonString = JSON.toJSONString(messages);
            ArrayList arrayList = JSON.parseObject(jsonString, ArrayList.class);
            Message message = JSON.parseObject(arrayList.get(0).toString(), Message.class);
            System.out.println(message);
            ArrayList<Message> messageList = JSON.parseObject(jsonString, new TypeReference<ArrayList<Message>>() {
            });
            System.out.println(messageList);
    

    image

    艾欧尼亚,昂扬不灭,为了更美好的明天而战(#^.^#)
  • 相关阅读:
    净化心灵的诗歌--《当你老了》
    慎在信号的handler中嵌入复杂的逻辑
    windows远程ssh与scp操作linux
    Java Annotation(Java 注解)
    HTML5实现的类似百度文库,豆丁在线文档阅读
    FreeMarker VS Velocity(freemarker模板引擎和velocity模板引擎比较)
    J2EE牛人或者老的JAVA程序员进来帮忙指点一二,小弟很迷茫_Baidu知道
    模仿Hibernate的逆向工程_java版_源码下载
    Adobe Photoshop CS6_下载_补丁
    lucene in action_index and search
  • 原文地址:https://www.cnblogs.com/lovelywcc/p/15111942.html
Copyright © 2011-2022 走看看