热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

获取泛型的class_jackson解析泛型的正确写法

jackson解析泛型的正确写法解决1024当天遗留的bug:inunnamedmoduleofloaderappbug描述上次使用jackson进行数据转换的时候发
jackson解析泛型的正确写法

14a047c895441893bb871f76311d9a3a.png

解决1024当天遗留的bug:in unnamed module of loader 'app'

00367bbd7a1fc794e5d2bd99a380416a.png

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')

e59d1816ea7e567a7affb260341d66fd.png

错误代码如下:

  1. 第一种写法

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

  1. 第二种写法

ObjectMapper objectMapper = new ObjectMapper();  Map> map = objectMapper.readValue(body, Map.class);  List data = map.get("data");  User user = data.get(0);

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

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

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

整个人都懵了,找了好久都不知道咋回事。。

ResultDTO代码如下:

*/*** *** *@author* *RYZEYANG* ** @date 2020/10/24 14:50* **/*@Datapublic class ResultDTO {  */***   ** 描述*   **/*  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 users = objectMapper.readValue(data.toString(), javaType);

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

因为前面bjectMapper.readValue(body, ResultDTO.class);这里没法定义泛型T的类型。。所以jackson使用了这个LinkedHashMap来存解析的数据?

f37212e7031a93a952150d1d38f9b054.png

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

objectMapper.readValue(body, Map.class); 这里也是,没办法指定泛型?,所以jackson还是使用了这个LinkedHashMap来存解析的数据

de347d01dddf83222dd91c154de545b1.png

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

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

ResultDTO> listResultDTO = objectMapper.readValue(body, new TypeReference>>(){});

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

8ac3d623b2bae533dff49bf1d5eec174.png

结论

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

  1. 局部解析?:

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

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

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

  1. 直接解析?:

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

"( ̄y▽, ̄)╭ " ?




推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
author-avatar
永欣慧娟766
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有