jackson解析泛型的正确写法 | Java Debug 笔记

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: jackson解析泛型的正确写法本期 4ye 又带来了一个小 bug 啦,如下,小伙伴们是否见过这个异常呢?in unnamed module of loader 'app'bug描述上次使用jackson进行数据转换的时候发生了下面这个错误。java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class com.example.demo.model.User (java.util.LinkedHashMap is in module java.base of loader 'bo

jackson解析泛型的正确写法



本期 4ye 又带来了一个小 bug 啦,如下,小伙伴们是否见过这个异常呢?


in unnamed module of loader 'app'


bug描述


上次使用jackson进行数据转换的时候发生了下面这个错误。


java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class com.example.demo.model.User (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; com.example.demo.model.User is in unnamed module of loader 'app')
复制代码


网络异常,图片无法展示
|


错误代码如下:


  1. 第一种写法


ObjectMapper objectMapper = new ObjectMapper();
  ResultDTO<Object> resultDTO = objectMapper.readValue(body, ResultDTO.class);
  List<String> data = (List<String>)resultDTO.getData();
  List<User> list = objectMapper.convertValue(data, new TypeReference<List<User>>() { });
  System.out.println(data);  
  System.out.println(list);
  System.out.println(list.get(0)); *//这里报错了* 
复制代码


  1. 第二种写法


ObjectMapper objectMapper = new ObjectMapper();
  Map<String, List<User>> map = objectMapper.readValue(body, Map.class);
  List<User> data = map.get("data");
  User user = data.get(0);
复制代码


代码上body是从服务器获取到的数据,格式是{"data": [{},{}]}


转换成resultDTO也是正常的,可以拿到对应的data, 转换成list也是正常的!


然后bug来了!😱 去获取list中的一个元素就报错上面那个错了🙃🙄 两种写法都会报这个错误。。


整个人都懵了,无奈开启了 debug 之路~


ResultDTO代码如下:


*/***
 *** *@author* *RYZEYANG*
 ** @date 2020/10/24 14:50*
 **/*
@Data
public class ResultDTO<T> {
  */***
   ** 描述*
   **/*
  private String msg;
  */***
   ** 状态码*
   **/*
  private String code;
  */***
   ** 数据*
   **/*
  private T data;
}
复制代码


解决办法


突然想到自己之前也做过json的解析呀,那会都很顺利地解决的🐖


想着不用一步到位,先拿到那个节点的数据,再去转换看看。结果真的成功了!


方案一


代码如下:


ObjectMapper objectMapper = new ObjectMapper();
  JsonNode jsonNode = objectMapper.readTree(body);
  System.out.println(jsonNode);
  JsonNode data = jsonNode.get("data");
  System.out.println(data);
  JavaType javaType = objectMapper.getTypeFactory().constructParametricType(List.class, User.class);
  List<User> users = objectMapper.readValue(data.toString(), javaType);
复制代码


错误分析之错误代码的第一种写法


因为前面ojectMapper.readValue(body, ResultDTO.class);这里没法定义泛型T


的类型。。所以jackson使用了这个LinkedHashMap来存解析的数据🐖


网络异常,图片无法展示
|


错误分析之错误代码的第二种写法


objectMapper.readValue(body, Map.class); 这里也是,没办法指定泛型🐖,

所以jackson还是使用了这个LinkedHashMap来存解析的数据


网络异常,图片无法展示
|


分析到这里有点悟出来了!怎么才能将泛型加上去啊!🐖


方案二:使用泛型的正确写法如下:


ResultDTO<List<User>> listResultDTO = objectMapper.readValue(body, new TypeReference<ResultDTO<List<User>>>(){});
复制代码


debug看一下,终于正确了!!😁


网络异常,图片无法展示
|


结论


jaskson 解析使用泛型类的时候,有两种做法


  1. 局部解析🐖:


  • 通过readTree()去获取对应的jsonnode节点: JsonNode jsonNode = objectMapper.readTree(body);


  • 再获取到对应节点的数据jsonNode.get("data");


  • 最后通过readValue():objectMapper.readValue(data.toString(), new TypeReference<List<User>>(){}); 解析得到对应的数据


  1. 直接解析🐖:


  • objectMapper.readValue(body, new TypeReference<ResultDTO<List<User>>>(){});,直接一步到位。



目录
相关文章
|
28天前
|
存储 Java 计算机视觉
Java二维数组的使用技巧与实例解析
本文详细介绍了Java中二维数组的使用方法
44 15
|
28天前
|
前端开发 JavaScript Java
Java构建工具-maven的复习笔记【适用于复习】
这篇文档由「潜意识Java」创作,主要介绍Maven的相关知识。内容涵盖Maven的基本概念、作用、项目导入步骤、依赖管理(包括依赖配置、代码示例、总结)、依赖传递、依赖范围以及依赖的生命周期等七个方面。作者擅长前端开发,秉持“得之坦然,失之淡然”的座右铭。期待您的点赞、关注和收藏,这将是作者持续创作的动力! [个人主页](https://blog.csdn.net/weixin_73355603?spm=1000.2115.3001.5343)
35 3
|
28天前
|
存储 Java 开发者
【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。
本文详细介绍了 Java 中 `toString()` 方法的重写技巧及其重要
49 10
【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。
|
6天前
|
XML JSON Java
Java中Log级别和解析
日志级别定义了日志信息的重要程度,从低到高依次为:TRACE(详细调试)、DEBUG(开发调试)、INFO(一般信息)、WARN(潜在问题)、ERROR(错误信息)和FATAL(严重错误)。开发人员可根据需要设置不同的日志级别,以控制日志输出量,避免影响性能或干扰问题排查。日志框架如Log4j 2由Logger、Appender和Layout组成,通过配置文件指定日志级别、输出目标和格式。
|
2月前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
218 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
28天前
|
算法 搜索推荐 Java
【潜意识Java】深度解析黑马项目《苍穹外卖》与蓝桥杯算法的结合问题
本文探讨了如何将算法学习与实际项目相结合,以提升编程竞赛中的解题能力。通过《苍穹外卖》项目,介绍了订单配送路径规划(基于动态规划解决旅行商问题)和商品推荐系统(基于贪心算法)。这些实例不仅展示了算法在实际业务中的应用,还帮助读者更好地准备蓝桥杯等编程竞赛。结合具体代码实现和解析,文章详细说明了如何运用算法优化项目功能,提高解决问题的能力。
58 6
|
28天前
|
存储 算法 搜索推荐
【潜意识Java】期末考试可能考的高质量大题及答案解析
Java 期末考试大题整理:设计一个学生信息管理系统,涵盖面向对象编程、集合类、文件操作、异常处理和多线程等知识点。系统功能包括添加、查询、删除、显示所有学生信息、按成绩排序及文件存储。通过本题,考生可以巩固 Java 基础知识并掌握综合应用技能。代码解析详细,适合复习备考。
21 4
|
1月前
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
239 11
|
1月前
|
存储 分布式计算 Hadoop
基于Java的Hadoop文件处理系统:高效分布式数据解析与存储
本文介绍了如何借鉴Hadoop的设计思想,使用Java实现其核心功能MapReduce,解决海量数据处理问题。通过类比图书馆管理系统,详细解释了Hadoop的两大组件:HDFS(分布式文件系统)和MapReduce(分布式计算模型)。具体实现了单词统计任务,并扩展支持CSV和JSON格式的数据解析。为了提升性能,引入了Combiner减少中间数据传输,以及自定义Partitioner解决数据倾斜问题。最后总结了Hadoop在大数据处理中的重要性,鼓励Java开发者学习Hadoop以拓展技术边界。
50 7

热门文章

最新文章

推荐镜像

更多