热门标签 | 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▽, ̄)╭ " ?




推荐阅读
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 属性类 `Properties` 是 `Hashtable` 类的子类,用于存储键值对形式的数据。该类在 Java 中广泛应用于配置文件的读取与写入,支持字符串类型的键和值。通过 `Properties` 类,开发者可以方便地进行配置信息的管理,确保应用程序的灵活性和可维护性。此外,`Properties` 类还提供了加载和保存属性文件的方法,使其在实际开发中具有较高的实用价值。 ... [详细]
  • 本文深入解析了JDK 8中HashMap的源代码,重点探讨了put方法的工作机制及其内部参数的设定原理。HashMap允许键和值为null,但键为null的情况只能出现一次,因为null键在内部通过索引0进行存储。文章详细分析了capacity(容量)、size(大小)、loadFactor(加载因子)以及红黑树转换阈值的设定原则,帮助读者更好地理解HashMap的高效实现和性能优化策略。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 2.2 组件间父子通信机制详解
    2.2 组件间父子通信机制详解 ... [详细]
  • 类加载机制是Java虚拟机运行时的重要组成部分。本文深入解析了类加载过程的第二阶段,详细阐述了从类被加载到虚拟机内存开始,直至其从内存中卸载的整个生命周期。这一过程中,类经历了加载(Loading)、验证(Verification)等多个关键步骤。通过具体的实例和代码示例,本文探讨了每个阶段的具体操作和潜在问题,帮助读者全面理解类加载机制的内部运作。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
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社区 版权所有