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

    艾欧尼亚,昂扬不灭,为了更美好的明天而战(#^.^#)
  • 相关阅读:
    map()和filter()函数讲解与示例
    通过假设巧妙的判断出参数的最大值和最小值
    通过函数定义数据结构list中的每个元素是一个元组,扑克牌示例
    FileCloud 的原理简述&自己搭建文件云
    opengl学习笔记
    Pascal的sin^-1函数实现
    OpenGL键盘交互响应事件
    OpenGL 鼠标交互响应事件
    重踏比尔盖茨走过的路——模拟操作系统
    Pascal代码自动格式化
  • 原文地址:https://www.cnblogs.com/lovelywcc/p/15111942.html
Copyright © 2011-2022 走看看