Jackson 2.x 系列【4】对象映射器 ObjectMapper

有道无术,术尚可求,有术无道,止于术。

本系列Jackson 版本 2.0.0

源码地址:https://gitee.com/pearl-organization/study-seata-demo

文章目录

    • 1. 概述
    • 2. 案例演示
      • 2.1 创建对象
      • 2.2 写入
      • 2.3 读取
    • 3. 泛型擦除

1. 概述

在前两篇文档中,我们学习了JsonGeneratorJsonParser的简单用法,实际开发中很少用到它们,因为它们属于低级API,自由度高但用起来比较繁琐。 我们使用最多的还是ObjectMapper,它是jackson-databind数据绑定模块提供面向用户的高级API

官方注释中说明了主要的功能特性

  • 提供了从POJOJSON树模型读取和写入JSON的功能,并支持互相转换
  • 支持高度自定义,以使用不同样式的JSON内容
  • 支持更高级的对象概念,如多态泛型和对象标识
  • 充当了更高级的ObjectReaderObjectWriter类的工厂

2. 案例演示

首先需要引入jackson-databind数据绑定模块:

        <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.17.0</version></dependency>

2.1 创建对象

ObjectMapper提供了多个构造函数:

在这里插入图片描述
一般使用默认的构造函数即可,其他的方式后面会单独介绍:

        ObjectMapper objectMapper = new ObjectMapper();

2.2 写入

ObjectMapper提供了多个写入方法,支持将对象以JSON格式写入到文件、输出流等对象中,以及返回字符串、字节数组:
在这里插入图片描述
POJO对象转换为JSON字符串(序列化)示例如下:

        // POJO->JSONUser user = new User();user.setId(1767798780627279873L);user.setName("坤坤");user.setAge(18);String json = objectMapper.writeValueAsString(user);System.out.println(json);

控制台输出如下:

{"id":1767798780627279873,"name":"坤坤","age":18,"org":null,"roleList":null}

写入到文件示例如下:

        // 写入到文件File file = new File("E:\\TD\\pearl\\study-jackson-demo\\jackson-core-demo\\src\\main\\java\\com\\pearl\\jacksoncore\\demo\\file\\user.json");objectMapper.writeValue(file,user);

2.3 读取

ObjectMapper也提供了多个读取方法,支持从多种地方读取JSON内容并转换为POJO对象:

在这里插入图片描述
从文件中读取JSON并转换为POJO示例:

        // 文件读取JSON -> POJOUser readUserByFile = objectMapper.readValue(file, User.class);System.out.println(readUserByFile);

从字符串中读取JSON并转换为POJO(反序列化)示例:

        String jsonStr="{\"id\":1767798780627279873,\"name\":\"坤坤\",\"age\":18,\"org\":null,\"roleList\":null}";User userPojo = objectMapper.readValue(jsonStr, User.class);System.out.println(userPojo);

此外ObjectMapper实现了很多将JSON读取为树模型的方法:
在这里插入图片描述
树模型使用树状结构来呈现对象,例如用户对象的树模型示意图:
在这里插入图片描述
JSON不太好转换为某个标准的对象时,可以直接转换为统一的树模型,示例如下:

        String userJsonStr = "{\"id\":1767798780627279873,\"name\":\"坤坤\",\"age\":18,\"org\":null,\"roleList\":[{\"id\":null,\"roleName\":\"管理员\",\"roleCode\":\"ROLE_ADMIN\"},{\"id\":null,\"roleName\":\"普通用户\",\"roleCode\":\"ROLE_USER\"}]}";JsonNode jsonNode = objectMapper.readTree(userJsonStr);long userId = jsonNode.get("id").asLong();// 获取id 节点对应的值并转为 LongString userName = jsonNode.get("name").asText();// 获取 name 节点对应的值并转为 StringString roleName = jsonNode.get("roleList").get(0).get("roleName").asText(); //  获取 roleList 节点对应的值,再获取第一个元素,再获取roleName 的值并转为 String

3. 泛型擦除

相信大家对JAVA中的泛型已经十分了解,其本质是参数化类型,在后台返回给前端数据时,一般都会使用一个统一的响应结果封装类,并使用泛型标识返回数据的类型:

public class R<T> {/*** 状态码*/private Integer code;/*** 返回信息*/private String msg;/*** 数据*/private T data;public static <T> R<T> response(Integer code, String msg, T data) {R<T> result = new R<>();result.setCode(code);result.setMsg(msg);result.setData(data);return result;}// 省略 getter/setter......
}    

调用示例:

R<User> response = R.response(200, "操作成功", user);

但是在反序列化(将JSON转为POJO)并获取泛型指定的对象时,示例代码:

        String jsonStr = "{\"code\":200,\"msg\":\"操作成功\",\"data\":{\"id\":1767798780627279873,\"name\":\"坤坤\",\"age\":18,\"org\":null,\"roleList\":[{\"id\":null,\"roleName\":\"管理员\",\"roleCode\":\"ROLE_ADMIN\"},{\"id\":null,\"roleName\":\"普通用户\",\"roleCode\":\"ROLE_USER\"}]}}";R<User> response= objectMapper.readValue(jsonStr, R.class);User data = response.getData();

这时会引发ClassCastException类型转换异常:

Exception in thread "main" java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class com.pearl.jacksoncore.demo.pojo.User (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; com.pearl.jacksoncore.demo.pojo.User is in unnamed module of loader 'app')at com.pearl.jacksoncore.demo.databind.ObjectMapperTest.main(ObjectMapperTest.java:89)

通过Debug可以看到,虽然我们指定了接收对象的泛型为User,但是实际的data却是LinkedHashMap类型:

在这里插入图片描述
这是由于JAVA中的泛型擦除机制导致的,为了兼容老版本的Java和为了性能考虑,在编译期会进行类型擦除,在运行期间JVM并不知道泛型的存在,在对JSON字符串进行解析时,JVM自然也不知道需要将其解析为哪种类型,则默认解析为LinkedHashMap,所以导致ClassCastException类型转换异常。

针对JAVA泛型擦除问题,Jackson提供了TypeReference<T>抽象类指定转换时的泛型类型,这样在反序列化时,也就知道是什么类型了,使用示例如下:

R<User> response = objectMapper.readValue(jsonStr, new TypeReference<R<User>>() { });

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IO多分复用

#include<myhead.h> #define SER_PORT 8888 //服务器端口号 #define SER_IP "192.168.65.131" //服务器IPint main(int argc, const char *argv[]) {//1、创建一个套接字int sfd -1;sfd socket(AF_INET, SOCK_STREAM, 0); //参数1&#xff1a;…

北斗卫星引领农机春耕新时代

北斗卫星引领农机春耕新时代 随着现代科技的快速发展&#xff0c;北斗卫星成为了农业领域不可或缺的利器。在农机自动驾驶系统的引领下&#xff0c;农机正逐渐实现自主操作&#xff0c;为农民节省了大量的时间和精力&#xff0c;并最大限度地提高了农作物的产量和质量。 北斗…

30天拿下Rust之错误处理

概述 在软件开发领域&#xff0c;对错误的妥善处理是保证程序稳定性和健壮性的重要环节。Rust作为一种系统级编程语言&#xff0c;以其对内存安全和所有权的独特设计而著称&#xff0c;其错误处理机制同样体现了Rust的严谨与实用。在Rust中&#xff0c;错误处理通常分为两大类&…

词令微信小程序怎么添加到我的小程序?

微信小程序怎么添加到我的小程序&#xff1f; 1、找到并打开要添加的小程序&#xff1b; 2、打开小程序后&#xff0c;点击右上角的「…」 3、点击后底部弹窗更多选项&#xff0c;请找到并点击「添加到我的小程序」&#xff1b; 4、添加成功后&#xff0c;就可以在首页下拉我的…

迈入编程世界:C 语言初体验

写在前面&#xff1a;OK啊&#xff0c;前面我们介绍了C语言开发环境的搭建&#xff0c;今天我们再来初步的认识一下C语言&#xff0c;了解C语言的基础框架、数据的表现形式以及输入和输出。 文章特点&#xff1a;不会很正经&#xff0c;不会很学术&#xff0c;不会很理论&#…

J4G企业通讯ip电话 sip对讲主机 停车场对讲主机

J4G企业通讯ip电话 sip对讲主机 停车场对讲主机 SV-J4G 是一款企业级彩屏网络电话&#xff0c;具有高清语音&#xff0c;320x240 2.8英寸彩屏&#xff0c;支持千兆以太网&#xff0c;12个SIP账号&#xff0c;支持PoE供电&#xff0c;支持外接EHS无线耳机&#xff0c;三方电话会…

C++有关内存的那些事

个人主页&#xff1a;PingdiGuo_guo 收录转栏&#xff1a;C干货专栏 前言 本篇博客是讲解关于C内存的一些知识点的。 文章目录 前言 1.内存函数 1.1memcpy函数 1.2memmove函数 1.3 memset函数 2.各数据类型占用 2.1bool类型 2.2char类型 2.3short、int、long类型及整数…

京东商品信息采集API商品价格商品详情图主图抓取接口key(提供测试入口)

item_get 获得JD商品详情item_search 按关键字搜索商品item_search_img 按图搜索京东商品&#xff08;拍立淘&#xff09;item_search_shop 获得店铺的所有商品item_history_price 获取商品历史价格信息item_recommend 获取推荐商品列表buyer_order_list 获取购买到的商品订单列…

CMake笔记之GLOB和GLOB_RECURSE的使用方法

CMake笔记之GLOB和GLOB_RECURSE的使用方法 —— 杭州 2024-03-19 夜 文章目录 CMake笔记之GLOB和GLOB_RECURSE的使用方法1.GLOB使用方法2.GLOB对比GLOB_RECURSE 1.GLOB使用方法 在 CMake 中&#xff0c;file(GLOB ...) 命令用于将匹配特定模式的文件列表赋值给变量。这可以用…

MySQL中replace into详解、批量更新、不存在插入存在则更新、replace into的坑

文章目录 一、replace into原理二、replace into的三种形式三、replace into 使用案例3.1、replace into values3.1.1、只有主键且主键冲突3.1.2、有主键有唯一索引且主键冲突3.1.3、有主键有唯一索引且唯一索引冲突(有坑)3.1.4、有主键有唯一索引且与一条主键冲突与另一条唯一…

瑞_Redis_短信登录_基于Session实现登录流程

文章目录 项目介绍1 短信登录1.1 项目准备1.2 基于Session实现登录流程1.2.1 功能流程介绍1.2.1.1 发送短信验证码1.2.1.2 短信验证码登录、注册1.2.1.3 校验登录状态 1.2.2 实现发送短信验证码功能1.2.2.1 页面流程1.2.2.2 代码实现1.2.2.3 测试 1.2.3 实现短信验证码登录、注…

2024年蓝牙耳机哪个好?真人实测告诉你如何选购,避免后悔!

在繁忙的通勤途中&#xff0c;无线蓝牙耳机已成为我们摆脱线缆束缚、享受音乐的理想选择。面对众多品牌和型号&#xff0c;选择合适的耳机似乎并不简单。因此&#xff0c;我精心挑选了几款表现不错的蓝牙耳机&#xff0c;希望我的分享能为你提供有价值的参考。 一、如何挑选蓝牙…

搭建EMQX MQTT服务器(超详细)

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;服务器是一种实现 MQTT 协议的服务器软件。MQTT 是一种轻量级的、发布/订阅模式的消息传输协议&#xff0c;通常用于物联网&#xff08;IoT&#xff09;应用中的设备通信。MQTT 服务器负责接收来自客户端的消息…

Java_13 反转字符串中的单词 III(方法一将String改为StringBuilder)

一、反转字符串中的单词 III 给定一个字符串 s &#xff0c;你需要反转字符串中每个单词的字符顺序&#xff0c;同时仍保留空格和单词的初始顺序。 示例 1&#xff1a; 输入&#xff1a;s "Lets take LeetCode contest" 输出&#xff1a;"steL ekat edoCteeL …

数据之谜:解读Facebook的用户行为

在当今数字化时代&#xff0c;社交媒体平台已经成为人们生活中不可或缺的一部分&#xff0c;而Facebook作为全球最大的社交网络之一&#xff0c;其背后隐藏着许多数据之谜。本文将深入探讨Facebook的用户行为&#xff0c;并试图解读其中的奥秘。 用户行为数据的收集 Facebook作…

在Arm 虚拟硬件(AVH)部署深度学习OCR算法

AI算法的嵌入式部署 AI算法在独立的设备上运行其实就是行业内的嵌入式AI的概念, 大致过程如下: 开发AI模型, 2.对数据集进行处理, 3.训练AI模型并验证效果, 4.转成ONNX格式(ONNX:万金油中间格式,给模型优化和部署带来了更多可能性)或者借助libtorch或者TensorFlow来部署C++版…

CSS学习(3)-浮动和定位

一、浮动 1. 元素浮动后的特点 脱离文档流。不管浮动前是什么元素&#xff0c;浮动后&#xff1a;默认宽与高都是被内容撑开&#xff08;尽可能小&#xff09;&#xff0c;而且可以设置宽 高。不会独占一行&#xff0c;可以与其他元素共用一行。不会 margin 合并&#xff0c;…

json字符串的数据提取

json的数据提取 学习目标 掌握 json相关的方法(load loads dump dumps)了解 jsonpath的使用(提取 json中的数据) 2 复习什么是json JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式&#xff0c;它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和…

【LeetCode: 173. 二叉搜索树迭代器 + dfs + 二叉搜索树】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

docker入门(五)—— 小练习,docker安装nginx、elasticsearch

练习 docker 安装 nginx # 搜素镜像 [rootiZbp15293q8kgzhur7n6kvZ home]# docker search nginx NAME DESCRIPTION STARS OFFICIAL nginx …