Jackson: java.util.LinkedHashMap cannot be cast to X

Jackson是一个广泛使用的 Java 库,它允许我们方便地序列化/反序列化 JSON 或 XML。

有时,当我们尝试将 JSON 或 XML 反序列化为对象集合时,可能会遇到” java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to X “。

在本教程中,我们将讨论为什么会发生上述异常以及如何解决该问题。

让我们创建一个简单的 Java 应用程序来重现此异常,以了解异常何时发生。

2.1 创建 POJO 类

5.使用 _JsonNode_对象和 _objectMapper.convertValue()_方法

我们已经看到了将TypeReference或JavaType对象传递给objectMapper.readValue()方法的解决方案。

或者,我们可以在 Jackson 中使用树模型节点, 然后通过调用objectMapper.convertValue()方法将JsonNode对象转换为所需的类型。

同样,我们可以将TypeReference或JavaType的对象传递给objectMapper.convertValue()方法。

让我们看看每种方法的实际效果。

首先,让我们使用TypeReference 对象和objectMapper.convertValue()方法创建一个测试方法:

现在,让我们看看当我们将 _JavaType_对象传递给 _objectMapper.convertValue()_方法时会发生什么:

如果我们运行这两个测试,它们都会通过。因此,使用 _objectMapper.convertValue()_方法是解决问题的另一种方法。

6.创建通用反序列化方法

到目前为止,我们已经解决了在将 JSON 数组反序列化为 Java 集合时如何解决类转换问题。在现实世界中,我们可能希望创建一个通用方法来处理不同的元素类型。

现在对我们来说这不会是一项艰巨的工作。我们可以 在调用 _objectMapper.readValue()_方法时传递一个 _JavaType_对象:

接下来,让我们创建一个单元测试方法来验证它是否按预期工作:

如果我们运行它,测试将通过。

为什么不使用 _TypeReference_方法来构建泛型方法,因为它看起来更紧凑?

现在,让我们创建一个通用实用程序方法并将相应的 _TypeReference_对象传递给 _objectMapper.readValue()_方法:

该方法看起来很简单。如果我们再次运行测试方法,我们将得到:

糟糕,发生异常!

我们已经将一个 _TypeReference_对象传递给 _readValue()_方法,并且我们之前已经看到这种方法可以解决类转换问题。那么,为什么在这种情况下我们会看到相同的异常?

这是因为我们的方法是通用的。类型参数 T_不能在运行时具体化,即使我们传递一个带有类型参数 _T的 _TypeReference_实例。

本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。

Original: https://www.cnblogs.com/lingyejun/p/16379972.html
Author: 翎野君
Title: Jackson: java.util.LinkedHashMap cannot be cast to X

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/537191/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Mybatis简介

    1、Mybatis简介 mybatis需要基础:jdbc,MySQL,Java基础,maven,Junit 之后所有的框架:都有配置文件的,如何学习: *最好的方式是看官方文档 1…

    Java 2023年6月13日
    095
  • 栈的定义和应用(数组模拟)

    1、定义 栈是一个 先入后出的有序列表 栈(stack)是限制线性表中元素的插入和删除只能在线性表的 同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶,另一…

    Java 2023年6月16日
    092
  • Java字符串处理:随机字符串,提取数字,身份证号码

    一、随机字符串 /** * * @param count 随机字符串&…

    Java 2023年6月5日
    062
  • Fizz网关入门教程-快速聚合多接口

    背景介绍 先看一张图,页面一共调用了20多个后端接口,页面出现了明显的卡顿,而且每6个请求一组,只有前一组返回后才执行下一组。看到请求是pending状态,很容易以为是后端接口的问…

    Java 2023年6月9日
    093
  • Linux命令拾遗-我的进程消失了

    原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 简介 程序员但凡工作时间久一点,总会遇到一些诡异的事情,比如每当你下班时,服务就挂,然后业务同学就各…

    Java 2023年6月7日
    097
  • Spring Boot 整合 MyBatis

    MyBatis 简介 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的…

    Java 2023年6月9日
    069
  • sql索引优化思路

    【开发】SQL优化思路(以oracle为例) powered by wanglifeng https://www.cnblogs.com/wanglifeng717 单表查询的优化…

    Java 2023年6月9日
    0123
  • 关于Java执行Cmd命令出现的死锁问题解决

    之前研究了Java通过执行cmd命令从而触发Android打包的思路,但是发现Android打包成功之后,后面的代码逻辑就不走了(连输出都没有) 经过了一天的排查,终于是从网上找到…

    Java 2023年6月14日
    077
  • Redis进阶(一)

    通过简单的KV数据库理解Redis 分为访问模块,操作模块,索引模块,存储模块 底层数据结构 除了String类型,其他类型都是一个键对应一个集合,键值对的存储结构采用哈希表 哈希…

    Java 2023年6月8日
    0109
  • Golang中的空字符,似花不是花

    最近在Linux下开发Go程序,发现一个奇怪的问题,在读取Linux系统信息时读到了空字符,导致了程序异常。在 ASSIC中十六进制0为字符NUT,表示为 空字符NULL。但这个字…

    Java 2023年6月16日
    091
  • rabbitMQ的Streams

    (其实一点都不新,kafka都加入10年了吧?) 几个特点(其实就是抄kafka的 stream) 1 持久化 2 append-only(不可变数据) 3 非破坏性消费者语义(n…

    Java 2023年5月30日
    066
  • Linux-内核升级

    一、 离线升级 1.1 下载内核文件 下载地址: https://elrepo.org/linux/kernel/el7/x86_64/RPMS/ 进入后可以看到很多版本文件,一般…

    Java 2023年6月8日
    082
  • Python基本语法学习

    CSN Python学习作业 Python的变量不需要声明,但每个变量在使用前都必须赋值。在Python中,变量就是变量,它没有所谓的”类型”一说 Pyth…

    Java 2023年6月7日
    057
  • 初学Java时没有理解的一些概念

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月5日
    085
  • Swagger详解(SpringBoot+Swagger集成)

    Swagger-API文档接口引擎Swagger是什么Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和…

    Java 2023年5月30日
    098
  • Visual Studio 更新NuGet

    打开Visual Studio(以下简称VS)之后,在上方选项栏找到工具选项,点开之后找到扩展和更新。 在左边找到更新,选择VS库就会看见NuGet 包管理器更新。直接点击更新后会…

    Java 2023年5月29日
    077
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球