ObjectMapper的具体介绍与使用

文章目录

  • 声明
  • 一、前言
  • 二、ObjectMapper与JSONObject比较
    • 1、核心主要有三个部分:
      • 依赖包不同
    • 2、ObjectMapper使用概述
      • 2.1、工程的pom.xml导包信息
      • 2.2、创建案例中的测试对象
      • 2.3、对象和JSON相互转化
        • 2.3.1、测试代码
        • 2.3.2、测试结果展示
      • 2.4、集合和JSON像话转化
        • 2.4.1、测试代码
        • 2.4.2、测试结果展示
      • 2.5、Map和JSON相互转化
        • 2.5.1、测试代码
        • 2.5.2、测试结果展示
    • 3、如果不需要JSON与其他转化,而是直接获取
    • 4、在Springboot工程中,通过配置的方式,配置ObjectMapper配置
    • 5、常见的ObjectMapper配置及问题总结
      • 5.1、如果生成的JSON使用的是单引号,解析会失败
      • 5.2、生成的JSON字符串属性没有双引号或者单引号问题
      • 5.3、JSON字符串转化对象,JSON中的属性名称与对象属性名称不同问题
      • 5.4、对象转化成JSON字符串,如果属性值为null,不被序列化
    • 6、源码下载

在这里插入图片描述

声明

  • 原文地址:https://blog.csdn.net/tangshiyilang/article/details/134275828
  • 作者:csdn:https://blog.csdn.net/tangshiyilang?type=blog

一、前言

  • ObjectMapper 类(com.fasterxml.jackson.databind.ObjectMapper)是 Jackson 的主要类,它可以帮助我们快速的进行各个类型和 Json 类型的相互转换。

二、ObjectMapper与JSONObject比较

  • ObjectMapper属于jackson库的一部分,JSONObject属于alibaba的fastjson,两者各有优劣,可根据自己的系统环境选择使用哪种技术。
  • 目前来看,Jackson社区相对活跃,Spring MVC和Spring Boot都默认使用Jackson。

1、核心主要有三个部分:

  • jackson-core(核心包)、jackson-databind(数据绑定包)、jackson-annotations(注解包)

依赖包不同

//JSONObject依赖包<dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.42</version></dependency>//ObjectMapper依赖包<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.2</version></dependency>

2、ObjectMapper使用概述

  • ObjectMapper通过writeValue()实现序列化,通过readValue()实现反序列化。

  • ObjectMapper通过Feature枚举类,初始化了很多的默认配置。

2.1、工程的pom.xml导包信息

  • spring-boot-starter-web包中包含了jackson包,不需要单独导入
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.17</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.txc</groupId><artifactId>objectmapper</artifactId><version>0.0.1-SNAPSHOT</version><name>objectmapper</name><description>objectmapper</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

2.2、创建案例中的测试对象

  • 案例中使用lombok注解生成get和set方法,也可以直接写get和set方法
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student {private String stu_id;private String stu_name;
}

2.3、对象和JSON相互转化

2.3.1、测试代码
/*** 实现对象和JSON之间互转*/
@RequestMapping("/jsonObjectChange")
@ResponseBody
public  void  jsonObjectChange() throws Exception{ObjectMapper mapper = new ObjectMapper();String param = "{\"stu_id\":\"1001\",\"stu_name\":\"晓春\",\"stu_sex\":\"男\",\"stu_age\":\"34\",\"stu_addr\":\"安徽合肥\",\"stu_pwd\":\"123456\"}";//将字符串转换为对象—反序列化过程Student student = mapper.readValue(param, Student.class);System.out.println("===json转对象==="+student.toString());//将对象转化成JSON—序列化过程String  json = mapper.writeValueAsString(student);System.out.println("===对象转json==="+json);
}
2.3.2、测试结果展示

2.4、集合和JSON像话转化

2.4.1、测试代码
/*** 集合和JSON相互转化*/
@RequestMapping("/listAndJSONChange")
@ResponseBody
public void  arrayToObject() throws Exception{Student student1=new Student("1001","晓春1","男","34","安徽合肥","123456");Student student2=new Student("1002","晓春2","男","34","安徽合肥","123456");ObjectMapper mapper = new ObjectMapper();//集合转jsonString param = mapper.writeValueAsString(Arrays.asList(student1,student2));System.out.println("==集合转json=="+param);//数组json转化成集合List<Student> list= mapper.readValue(param, List.class);System.out.println("==数组json转集合=="+list);
}
2.4.2、测试结果展示

2.5、Map和JSON相互转化

2.5.1、测试代码
/*** map和json相互转化*/
@RequestMapping("/mapAndJsonChange")
@ResponseBody
public void  mapAndJsonChange() throws Exception{ObjectMapper mapper = new ObjectMapper();Map<String, Object> map = new HashMap<>();map.put("id", "1001");map.put("name","晓春");map.put("student", new Student("6","6","6","6","6","6"));String param = mapper.writeValueAsString(map);System.out.println("===map转json==="+param);Map<String, Object> resultMap = mapper.readValue(param, Map.class);System.out.println("===json转map==="+resultMap);
}
2.5.2、测试结果展示

3、如果不需要JSON与其他转化,而是直接获取

  • 使用 readTree,通过节点树的方式直接获取JSON属性对应的值

  • 使用链接:https://blog.csdn.net/tangshiyilang/article/details/134326627

4、在Springboot工程中,通过配置的方式,配置ObjectMapper配置

  • 方便使用,一次性配置,会在springboot工程启动的时候自动获取配置
@Configuration
public class ObjectMapperConfig {@Bean("objectMapper")public ObjectMapper getObjectMapper(){ObjectMapper  mapper = new ObjectMapper();//属性为NULL 不序列化mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);//属性为默认值不序列化mapper.setSerializationInclusion(JsonInclude.Include.NON_DEFAULT);//反序列化时,遇到未知属性不报错mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);//如果是空对象的时候,不抛异常mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);//修改序列化后日期格式mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));return mapper;}}

5、常见的ObjectMapper配置及问题总结

5.1、如果生成的JSON使用的是单引号,解析会失败

  • 问题的json样式:String param=“{‘stu_id’:‘1001’,‘stu_name’:‘****晓春’}”;

  • 默认支持的是双引号,在很多的环境中都是。

  • 解决博客地址:https://blog.csdn.net/tangshiyilang/article/details/134275584

5.2、生成的JSON字符串属性没有双引号或者单引号问题

  • 问题json样式:String param=“{stu_id:\“1001\”,stu_name:\”****晓春\“}”;

  • 解决博客地址:https://blog.csdn.net/tangshiyilang/article/details/134281368

5.3、JSON字符串转化对象,JSON中的属性名称与对象属性名称不同问题

  • 问题描述:JSON字符串中出现了属性名称与对象中的名称不一致的情况,而造成的解析错误。

  • 解决博客地址:https://blog.csdn.net/tangshiyilang/article/details/134281585

5.4、对象转化成JSON字符串,如果属性值为null,不被序列化

  • 解决博客地址:解析JSON字符串:属性值为null的时候不被序列化-CSDN博客

6、源码下载

  • 源码需要积分:https://download.csdn.net/download/tangshiyilang/88512083

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

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

相关文章

设计和实现24位位图图片色彩翻转成互补色程序。

实验题目&#xff1a;设计和实现24位位图图片色彩翻转成互补色程序。 &#xff08;提示&#xff1a;24位位图文件中的数据部分定义了每上像素像素单元&#xff0c;每个像素由三个字节组成&#xff0c;分别表示红、绿、蓝&#xff08;r,g,b&#xff09;三个分量&#xff0c;假设…

Matlab|电价型负荷需求响应(考虑电价变化)

程序复现来源于《计及需求响应消纳风电的电-热综合能源系统经济调度 》第四章内容。 一、原理 需求响应的基本原理是需求侧根据电力市场价格和电网要求改变其负荷需求以 获取一定的利益回报。其中 PDR 可通过直观的电价变化信号引导用户调节用电方式&#xff0c; 从而达到优…

2024.4.13力扣每日一题——找到冠军 II

2024.4.13 题目来源我的题解方法一 拓扑排序思想 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2924 我的题解 方法一 拓扑排序思想 计算每个节点的入度&#xff0c;只有入度为0的节点才可能是冠军&#xff0c;但是若存在多个入度为0的节点&#xff0c;则无法知道谁是…

Qt for Android 开发环境

在搭建环境时开始感觉还挺顺利的&#xff0c;从 Qt 配置的环境里面看并没有什么问题&#xff0c;可真正编译程序的时候发现全是错误。 最开始的时候安装了 JDK21 最新版本&#xff0c;然后根据 JDK21 安装 ndk, build-tools, Platform-Tools 和 Gradle&#xff0c;但是不管这么…

图书管理员

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 图书馆中每本书都有一个图书编码&#xff0c;可以用于快速检索图书&#xff0c;这个图书编码是一个正整数。 每位借书的读者手中有一个需求码&#xff0c;这个需求码也是一个正整数…

零基础自学Python,啃透这五本书就够了!

选择合适的学习资源 在自学Python的前期&#xff0c;选择一本适合初学者的Python入门书籍或在线教程&#xff0c;从基础开始学习&#xff0c;好的入门书籍或在线教程会按照逻辑顺序组织知识&#xff0c;从基础概念开始&#xff0c;逐步引导你深入学习Python编程语言。这种系统…

如何在深度学习中调用CAME

1、介绍 CAME&#xff1a;一种以置信度为导向的策略&#xff0c;以减少现有内存高效优化器的不稳定性。基于此策略&#xff0c;我们提出CAME同时实现两个目标:传统自适应方法的快速收敛和内存高效方法的低内存使用。大量的实验证明了CAME在各种NLP任务(如BERT和GPT-2训练)中的…

Android Jetpack 组件

1、ViewModel 用于将数据与Activity分离&#xff0c;这样在Activity声明周期中&#xff0c;数据不会丢失。 &#xff08;1&#xff09;简单使用 implementation ("androidx.lifecycle:lifecycle-extensions:2.2.0") // 使用ViewModel组件需要额外添加<LinearLay…

必应bing竞价广告推广开户联系方式?

随着互联网广告市场的日益繁荣与细分&#xff0c;必应Bing作为全球重要的搜索引擎之一&#xff0c;在国内市场也逐渐展现出强大的潜力与吸引力。越来越多的企业开始关注并探索必应Bing搜索广告所带来的巨大商机。其中&#xff0c;云衔科技以其卓越的专业素养和全面的服务体系&a…

stable diffusion--小白学习步骤

1.看一下Unet网络的讲解_哔哩哔哩_bilibili&#xff0c;了解Unet网络 2.看一下【生成式AI】Diffusion Model 原理剖析 (1/4)_哔哩哔哩_bilibili&#xff0c;起码要看前3/6个视频 3.看一下超详细的扩散模型&#xff08;Diffusion Models&#xff09;原理代码 - 知乎 (zhihu.co…

鑫鹿助贷CRM系统:助力助贷行业实现智能商业转型

数字化时代&#xff0c;商业竞争愈发激烈&#xff0c;助贷行业如何把握商机、实现高效管理、打造高回报率的商业模式&#xff0c;成为了助贷行业老板们比较关注的问题&#xff0c;而鑫鹿助贷CRM管理系统&#xff0c;正是这场商业变革中的得力助手&#xff0c;系统功能完善&…

途游游戏,科锐国际(计算机类),快手,得物,蓝禾,奇安信,顺丰,康冠科技,金证科技24春招内推

途游游戏&#xff0c;科锐国际&#xff08;计算机类&#xff09;&#xff0c;快手&#xff0c;得物&#xff0c;蓝禾&#xff0c;奇安信&#xff0c;顺丰&#xff0c;康冠科技&#xff0c;金证科技24春招内推 ①得物 【岗位】技术&#xff0c;设计&#xff0c;供应链&#xff0…

每帧纵享丝滑——ToDesk云电脑、网易云游戏、无影云评测分析及ComfyUI部署

目录 一、前言二、云电脑性能测评分析2.1、基本配置分析2.1.1、处理器方面2.1.2、显卡方面2.1.3、内存与存储方面2.1.4、软件功能方面 2.2、综合跑分评测 三、软件应用实测分析3.1、云电竞测评3.2、AIGC科研测评——ComfyUI部署3.2.1、下载与激活工作台3.2.2、加载模型与体验3.…

vba学习系列(4)-- index()提取指定单元格并保留字体格式

系列文章目录 文章目录 系列文章目录一、目标需求二、使用步骤1.VBA程序2.VBA简要程序 总结 一、目标需求 工作表2 B列中姓名&#xff0c;在工作表1 C列中存在相同姓名时&#xff0c;提取工作表2 AK列的对应单元格内容&#xff1b; 工作表2名称&#xff1a;OQC 工作表1名称&…

AGI的智力有可能在两年内超过人类水平

特斯拉CEO埃隆马斯克近日与挪威银行投资管理基金CEO坦根的访谈中表示&#xff0c;AGI的智力将在两年内可能超过人类智力&#xff0c;在未来五年内&#xff0c;AI的能力很可能超过所有人类。 马斯克透漏&#xff0c;去年人工智能发展过程中的主要制约因素是缺少高性能芯片&#…

基于springboot实现人事管理系统项目【项目源码+论文说明】

基于springboot实现人事管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;作为学校以及一些培训机构&#xff0c;都在用信息化战术来部署线上学习以及线上考试&#xff0c;可以与线下的考试有机的结合在一起&#xff0c;实现基于vue的人事系统在技术…

c++ 栈溢出问题

示例代码: #include <iostream> #include <chrono> #include <fstream>int main() {// 测量内存操作的执行时间int num = 1024 * 1024;int arry[num] = {2};int arry_tmp[num] = {0};std::ofstream outfile("data.bin", std::ios::binary | std:…

【LeetCode热题100】【二分查找】搜索二维矩阵

题目链接&#xff1a;74. 搜索二维矩阵 - 力扣&#xff08;LeetCode&#xff09; 在一个有序二维数组里面查找元素&#xff0c;同【LeetCode热题100】【矩阵】搜索二维矩阵 II-CSDN博客 如果用二分查找&#xff0c;时间复杂度是log(mn)&#xff0c;但是可以实现时间复杂度为O…

交通大模型与时序大模型整理【共15篇工作】【附开源代码】

随着城市化进程的加速和交通系统的不断发展&#xff0c;对交通数据和时序数据的整理与分析变得尤为重要。本文旨在探讨交通大模型与时序大模型的整理及其在城市规划、交通管理等领域的应用。交通大模型涉及交通流量、道路网络、交通规划等方面的数据&#xff0c;而时序大模型则…

代码随想录-算法训练营day10【栈与队列01:理论基础、用栈实现队列、用队列实现栈】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第五章 栈与队列part01 ● day 1 任务以及具体安排&#xff1a;https://docs.qq.com/doc/DUG9UR2ZUc3BjRUdY ● day 2 任务以及具体安排&#xff1a;https://docs.qq.com/doc/DUGRwWXNOVEpyaVpG ● day 3 任务以及…