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

目录

一、复杂类型反序列化

1.1、背景

1.2、问题解决


一、复杂类型反序列化


1.1、背景

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

java 复制代码
@Data
public class AppResult {

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

}

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

java 复制代码
@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 类型的对象。

java 复制代码
            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>() {});

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

相关推荐
AI人工智能+电脑小能手39 分钟前
【大白话说Java面试题】【Java基础篇】第32题:Java的异常处理机制是什么
java·开发语言·后端·面试
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ2 小时前
通过java后端代码来实现给word内容补充格式文本内容控件,以及 设置控件的标记和标题
java·c#·word
無限進步D3 小时前
Java 面向对象高级 接口
java·开发语言
逸Y 仙X3 小时前
文章二十七:ElasticSearch ES查询模板(Search Template)高效复用实战
java·大数据·数据库·elasticsearch·搜索引擎·全文检索
二哈赛车手3 小时前
新人笔记---Spring AI的Advisor以及其底层机制讲解(涉及源码),包含一些遇见的Spring AI的Advisor缺陷问题的解决方案
java·人工智能·spring boot·笔记·spring
AC赳赳老秦4 小时前
接口测试自动化:用 OpenClaw 对接 Postman,实现批量回归测试、测试报告自动生成与推送
java·人工智能·python·算法·elasticsearch·deepseek·openclaw
两年半的个人练习生^_^4 小时前
Java日志框架和使用、日志记录规范
java·开发语言·开发规范
pq2174 小时前
最简单的理解synchronized锁升级
java
杨凯凡4 小时前
【032】排查入门:jstack、heap dump、Arthas 初识
java·开发语言·后端