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

艾欧尼亚,昂扬不灭,为了更美好的明天而战(#^.^#)
原文地址:https://www.cnblogs.com/lovelywcc/p/15111942.html