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);
艾欧尼亚,昂扬不灭,为了更美好的明天而战(#^.^#)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构