ObjectMapper - 实现复杂类型对象反序列化(天坑!)

news2024/11/28 10:35:31

目录

一、复杂类型反序列化

1.1、背景

1.2、问题解决


一、复杂类型反序列化


1.1、背景

a)例如有 AppResult 对象,如下:

@Data
public class AppResult {

    private Integer code;
    private String msg;
    private Object data;

}

b)AppResult 对象中 Object 类型的 data 数据传入一个 User 对象,如下:

@Data
public class User {

    private Long id;

    private String username;

    private String password;

}

c)然后将 AppResult 对象通过 ObjectMapper.writeValueAsString 序列化成 JSON 格式.

1.2、问题解决

那么我们该怎么反序列化呢?

一个错误的思路如下:

a)使用 ObjectMapper.readValue() 反序列化成 AppResult 对象.

b)然后他取出 AppResult 中的 data 数据,但由于是 Object 类型,因此需要强制类型转化成 User 对象.

结果就是报错:java.util.LinkedHashMap cannot be cast to User

原因如下:

当使用 ObjectMapper.readValue() 方法将 JSON 字符串反序列化为 AppResult 对象时,如果 AppResult 对象的 data 属性是一个泛型(如 Object ),那么 Jackson 将无法知道这个属性的确切类型,因此会将其反序列化为一个 LinkedHashMap.

解决办法:

我们首先解析整个 JSON 字符串为 AppResult 对象。然后,我们使用 ObjectMapper 的 convertValue 方法将 AppResult 对象中的 data 属性转换为一个 User 对象。这里我们使用了 TypeReference 来指定我们希望得到的是一个 User 类型的对象。

            AppResult result = null;
            try {
                result = objectMapper.readValue(userinfo, AppResult.class);
            } catch (JsonProcessingException e) {
                throw new RuntimeException(e);
            }
            //3.解析出用户信息
            User user = objectMapper.convertValue(result.getData(), new TypeReference<User>() {});

ObjectMapper 的 convertValue 方法在 Jackson 库中是用来进行对象转换的。这个方法可以将一种 Java 类型转换为另一种 Java 类型。例如,如果你有一个 Map 对象,你可能想要将它转换为一个更具体的对象。convertValue 方法可以帮助你完成这种转换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1192477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Postgresql 常用整理

文章目录 1. 查询1.1数据库表1.1.1 获取指定数据库表1.1.2 获取指定数据库表所有列名 1.2 别名1.2.1 子表指定别名1.2.2 查询结果指定别名 1.3 临时表1.3.1 定义临时表1.3.2 使用临时表 1.4 子表1.5 分组1.5.1 group by1.5.2 partition by 1.6 分组后合并指定列字段&#xff1a…

基于若依的ruoyi-nbcio流程管理系统仿钉钉流程json转bpmn的flowable的xml格式(排它条件网关)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 这个章节来完成并行网关与排它条件网关的功能 1、前端 目前就修改了排它条件网关的前端条件部分&#xf…

SAP 11策略测试简介

下面我们将测试11策略 1、首先准备好物料 成品物料为AB1,在MRP3视图中维护对应的策略组的11 同时选择消耗模式为2.消耗期间都是999 在这个视图上,我们不仅仅是将“策略组”字段维护成11,同时,我们还需要将“综合MRP”字段维护成“2”。这就是11策略很特别的地方。“策略组”…

excel如何加密(excel加密的三种方法)

Excel是一款广泛使用的办公软件&#xff0c;有时候我们需要对一些重要的Excel文件进行加密&#xff0c;以保证文件的安全性。下面将介绍3种常用的Excel加密方法。 方法一&#xff1a;通过路径文件-另存为-工具-常规选项-设置打开或修改权限密码&#xff08;密码只可以使数字、字…

龙讯旷腾半导体缺陷计算大赛发布

2023计算大赛 第二期半导体缺陷计算大赛 选拔赛截止日期11月23日晚 决赛截止日期11月30日晚 线上线下同步 线下11月末杭州 大赛亮点 免费培训、灵活安排时间参与、线上线下&#xff08;杭州&#xff09;同步召开 多次机会冲关决赛奖励金 已购/未购用户均可参加、无身份…

android开发布局知识

插件开发的视频笔记&#xff1a;

PM - 项目管理 产品管理区别

产品管理和项目管理是两个在企业中至关重要的职能部门&#xff0c;它们各自承担着不同的职责和任务。虽然两者在某些方面存在重叠&#xff0c;但它们的核心目标和方法有很大的不同。本文将对产品管理和项目管理进行详细的比较和分析。 “项目管理和产品管理有什么区别&#xff…

雷达波形之一——LFM线性调频波形

文章目录 前言一、线性调频信号的形式1、原理2、时域表达式3、频域表达式 二、MATLAB 仿真1、涅菲尔积分①、MATLAB 源码②、仿真结果 2、LFM①、MATLAB 源码②、仿真结果1) 典型 LFM 波形&#xff0c;实部2) 典型 LFM 波形&#xff0c;虚部3) LFM 波形的典型谱 前言 线性调频…

2.前端调试(控制台使用)

消息堆叠 如果一条消息连续重复&#xff0c;而不是在新行上输出每一个消息实例&#xff0c;控制台将“堆叠”消息并在左侧外边距显示一个数字。此数字表示该消息已重复的次数。 如果您倾向于为每一个日志使用一个独特的行条目&#xff0c;请在 DevTools 设置中启用 Show times…

LeetCode 2258. 逃离火灾:BFS

【LetMeFly】2258.逃离火灾 力扣题目链接&#xff1a;https://leetcode.cn/problems/escape-the-spreading-fire/ 给你一个下标从 0 开始大小为 m x n 的二维整数数组 grid &#xff0c;它表示一个网格图。每个格子为下面 3 个值之一&#xff1a; 0 表示草地。1 表示着火的格…

打印流详解

概述 作用&#xff1a;打印流可以实现方便、高效的打印数据到文件中去。 高效体现在用到了缓冲流&#xff1a; public PrintStream(OutputStream out, boolean autoFlush, Charset charset) {super(out);this.autoFlush autoFlush;this.charOut new OutputStreamWriter(thi…

西门子S7-1200PLC混合通信编程(ModbusTcp和UDP通信)

S7-1200PLC的MODBUS-TCP通信 西门子PLC ModbusTcp通信访问网关后从站(SCL语言轮询状态机)-CSDN博客文章浏览阅读305次。西门子PLC的ModbusTcp通信在专栏已有很多文章介绍,所不同的是每个项目的通信需求都略有不同,今天我们以访问网关后的三个从站数据来举例,给出轮询的推荐…

【带头学C++】----- 三、指针章 ---- 3.10 函数指针(补充基础知识)

1.函数指针 1.1 函数的返回值类型为指针类型 将函数内部的合法地址通过返回值 返回给函数外部使用 注意:函数不要返回普通局部变量的地址 分析&#xff1a; 在这段代码中&#xff0c;函数getAddr()返回一个指向局部变量data地址&#xff08;作用域是函数内部&#xff09;的指…

单链表(5)

判空函数 *一进函数先断言 获取数据结点的个数函数 如图&#xff0c;p->nextNULL就跳出的话&#xff0c;当前p->data就没算上。 现在来测试一下 同样在空表时也调用一下 还有这样写的&#xff0c;出来的结果也是一样的&#xff0c;它也算是对的——但是&#xff0c;这是…

数据结构与算法—冒泡排序快速排序

目录 一、交换排序 二、冒泡排序 时间复杂度 三、快速排序 1、三种一次划分操作 Hoare法 挖洞法 前后指针法 三种方法总结&#xff1a; 2、改进划分效率 3、递归实现快速排序 4、非递归实现快速排序 栈的函数&#xff1a; 非递归排序函数&#xff1a; 5、时…

tensorboard玩耍手册

from torch.utils.tensorboard import SummaryWriter 来自官网的示例&#xff1a;TensorBoard: TensorFlow可视化 查看 event 文件 文件名含义 根据参考[1]文档的来说&#xff1a;文件名含义如下&#xff1a; <WORKING_DIR>/runs/<DATETIME>_<MACHINE_NAME>…

YOLOv8-Seg改进: 分割小目标系列篇 | 多头分割器,提升分割小目标和弱小分割精度

🚀🚀🚀本文改进:YOLOv8-Seg有3个分割头,能够多尺度分割,但对小目标分割可能存在分割能力不佳的现象,因此添加一个微小物体的分割头,能够大量涨点,map提升明显,特别是在处理低分辨率图像和分割小目标等更困难的任务时。 🚀🚀🚀多头分割器 分割小目标检测首选…

【Unity程序小技巧】如何消除多次Destory带来的性能消耗

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

如何优化负载均衡?一文讲懂

当web应用程序增长到单服务器无法承受的地步&#xff0c;企业就面临着优化负载均衡的需求。简而言之&#xff0c;企业需要实现流量重定向&#xff0c;就需要从业务可靠性的需求出发&#xff0c;寻找一套可行的负载均衡方案&#xff0c;那么常用的负载均衡方案有哪些&#xff1f…

Jenkins CICD过程常见异常

1 Status [126] Exception when publishing, exception message [Exec exit status not zero. Status [126] 1.1 报错日志 SSH: EXEC: STDOUT/STDERR from command [/app/***/publish.sh] ... bash: /app/***/publish.sh: Permission denied SSH: EXEC: completed after 200…