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();
    //集合转json
    String 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【让自己的U盘变得与众不同】

文章目录 今日座右铭&#xff1a;在心里种花&#xff0c;人生才不会荒芜。 文章目录 文章目录前言一、准备ICO图标二、插入U盘1.点击新建文本文档-输入代码-点击保存2.将代码文本文档名称修改为autorun.inf在这里插入图片描述3.将图标及代码文本文档放入U盘中在这里插入图片描述…

深度残差收缩网络中,使用 Sigmoid 函数的用意在哪?

在深度残差收缩网络中&#xff0c;使用 Sigmoid 函数将输出归一化到 0 和 1 之间的目的是为了限制输出值的范围&#xff0c;并且使得输出可以被解释为概率。这个 Sigmoid 函数的输出可以被看作是一个置信度或者概率的度量&#xff0c;表示某个事件发生的可能性。 在设置阈值时…

财富池指标--通达信主力建仓免费指标公式源码

主力交易一只个股&#xff0c;一般会经过以下几个阶段&#xff1a;建仓、拉升、出货。那么&#xff0c;怎么判断一只股票正处于主力建仓时期呢&#xff1f; 1、从k线图上来看 个股走势图中&#xff0c;连续出现小阳线的k线图&#xff0c;其成交量持续放量&#xff0c;或者在个…

【学习笔记】rt-thread

任务 创建好任务&#xff0c;不管是动态还是静态创建&#xff0c;任务的状态是init &#xff0c;通过start方法来启动任务&#xff1b;线程大小 设置小了&#xff0c;无法正常工作&#xff1f;显示占空间100% 启动过程 TODO 这是编译器特性&#xff1f; 因为RT-Thread使用编…

【QT+QGIS跨平台编译】181:【QGIS+Qt跨平台编译】—【错误处理:找不到_DEBUGA】

点击查看专栏目录 文章目录 一、找不到_DEBUGA二、原因分析三、错误处理 一、找不到_DEBUGA 报错信息&#xff1a; 二、原因分析 采用了非UNICODE&#xff1a; DEFINES - UNICODE没法识别 _DEBUGA 但可以识别 _DEBUG 三、错误处理 修改 _DEBUGA 为 _DEBUG

Android13 开机时间优化

前言 实际生活当中&#xff0c;针对某些应用场景&#xff0c;对Android启动时间要求比较严格&#xff0c;比如车载&#xff0c;车都开出去几公里了&#xff0c;IVI系统还没起来&#xff0c;这就比较尴尬&#xff0c;所以&#xff0c;优化Android启动时间是一项非常重要的工作。…

windows Nginx上部署若依后台管理登录界面之验证码不显示

大多数情况都是本地电脑Nginx部署正常&#xff0c;服务器Nginx部署验证码不显示。如下图 其实是Nginx配置有问题 server {listen 80;//监听端口server_name 域名或者公网ip等;location / {root D:/dist;//前端包文件路径需要修改index index.html; //不用管try_files …

k8s的service为什么不能ping通?——所有的service都不能ping通吗

点击阅读原文 前提&#xff1a;kube-proxy使用iptables模式 Q service能不能ping通&#xff1f; A: 不能&#xff0c;因为k8s的service禁止了icmp协议 B: 不能&#xff0c;因为clusterIP是一个虚拟IP&#xff0c;只是用于配置netfilter规则&#xff0c;不会实际绑定设备&…

深入理解 C++ 中的 KeyFrame 和 KeyFrame*:对象与指针的选择与管理

本文详细讨论了在 C 编程中 KeyFrame 类及其指针 KeyFrame* 的用法、区别与联系。通过探索两者的内存管理、生命周期及使用场景&#xff0c;本文旨在帮助开发者更好地理解何时以及如何选择使用对象或指针&#xff0c;从而提高代码的效率和安全性。 在 C 中&#xff0c;KeyFrame…

求1000以内正整数的平方根(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <math.h>int main() {//初始化变量值&#xff1b;int number 0;int result 0;//提示用户&#xff1b;printf("请输入1000以内求平方根的…

Python 版分布式消息队列 Kafka 实现图片数据传输

1、Kafka 介绍 在使用 Kafka 之前&#xff0c;通常需要先安装和配置 ZooKeeper。ZooKeeper 是 Kafka 的依赖项之一&#xff0c;它用于协调和管理 Kafka 集群的状态。 ZooKeeper 是一个开源的分布式协调服务&#xff0c;它提供了可靠的数据存储和协调机制&#xff0c;用于协调…

超越GPT-4V!马斯克发布Grok-1.5 With Vision

在 Grok-1 开源后不到一个月&#xff0c;xAI 的首个多模态模型就问世了。Grok-1.5V是XAI的第一代多模态模型&#xff0c;除了其强大的文本处理能力之外&#xff0c;Grok现在还能够处理包括文档、图表、图形、屏幕截图和照片在内的各种视觉信息。相信Grok-1.5V将很快提供给现有的…

基于ssm的社区再就业培训管理系统的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本社区再就业培训管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数…

【Spring】依赖注入(DI)时常用的注解@Autowired和@Value

目录 1、Autowired 自动装配 1.1、要实现自动装配不是一定要使用Autowired 1.2、Autowired的特性 &#xff08;1&#xff09;首先会根据类型去spring容器中找(bytype),如果有多个类型&#xff0c;会根据名字再去spring容器中找(byname) &#xff08;2&#xff09;如果根据名…

Sony Camera Remote SDK在Windows上的使用

Sony官方提供了相机遥控软件开发包&#xff0c;允许用户自行开发应用软件&#xff0c;实现对相机的远程控制&#xff0c;包括拍摄、监看和文件传输等。截至目前最新的版本是2024.4.12发布的1.12.00版本&#xff0c;下载链接如下&#xff1a;Camera Remote SDK | LICENSE AGREEM…

温湿度传感器(DHT11)以及光照强度传感器(BH1750)的使用

前言 对于一些单片机类的环境检测或者智能家居小项目中&#xff0c;温湿度传感器&#xff08;DHT11&#xff09;以及光照强度传感器&#xff08;BH1750&#xff09;往往是必不可少的两个外设&#xff0c;下面我们来剖析这两个外设的原理&#xff0c;以及使用。 1. 温湿度传感…

elasticsearch 下载、启动和账号密码登录

因为我的电脑是 window&#xff0c;以下都是以 window 环境举例。 一、下载 Elasticsearch 是使用 java 开发的&#xff0c;且 7.8 版本的 ES 需要 JDK 版本 1.8 以上&#xff0c;安装前注意java环境的准备。 官网地址&#xff1a;https://www.elastic.co/cn/ 下载地址&#xf…

云安全与网络安全:有什么区别?

云计算已经存在了一段时间&#xff0c;但某些术语的正确含义仍然存在混乱。一个例子是区分云安全与网络安全。 首先&#xff0c;让我们看一下网络安全一词 &#xff0c;以了解它的含义。然后&#xff0c;我们将将该术语与云安全进行比较&#xff0c;以了解两者在几个关键领域的…

OpenHarmony实战开发-如何使用AKI轻松实现跨语言调用。

介绍 针对JS与C/C跨语言访问场景&#xff0c;NAPI使用比较繁琐。而AKI提供了极简语法糖使用方式&#xff0c;一行代码完成JS与C/C的无障碍跨语言互调&#xff0c;使用方便。本示例将介绍使用AKI编写C跨线程调用JS函数场景。通过调用C全局函数&#xff0c;创建子线程来调用JS函…

DaVinci Fusion Studio:专业影视后期特效合成的得力助手

在当今影视制作领域&#xff0c;后期特效合成是不可或缺的一环。而DaVinci Fusion Studio作为一款功能强大的影视后期特效合成软件&#xff0c;以其出色的性能、直观的操作界面和丰富的特效库&#xff0c;受到了广大影视制作人员的喜爱。 首先&#xff0c;DaVinci Fusion Stud…