ObjectMapper的具体介绍与使用

文章目录

声明

一、前言

  • 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(注解包)

依赖包不同

xml 复制代码
//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 复制代码
<?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方法
java 复制代码
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student {
    private String stu_id;
    private String stu_name;
}

2.3、对象和JSON相互转化

2.3.1、测试代码
java 复制代码
/**
 * 实现对象和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、测试代码
java 复制代码
/**
 * 集合和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、测试代码
java 复制代码
/**
 * 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与其他转化,而是直接获取

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

  • 方便使用,一次性配置,会在springboot工程启动的时候自动获取配置
java 复制代码
@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使用的是单引号,解析会失败

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

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

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

6、源码下载

相关推荐
非 白12 分钟前
【Java】代理模式
java·开发语言·代理模式
Good Note23 分钟前
Golang的静态强类型、编译型、并发型
java·数据库·redis·后端·mysql·面试·golang
m0_7482365839 分钟前
跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围
spring boot·后端·tomcat
web151173602231 小时前
Spring Boot项目中解决跨域问题(四种方式)
spring boot·后端·dubbo
我就是我3521 小时前
记录一次SpringMVC的406错误
java·后端·springmvc
向哆哆1 小时前
Java应用程序的跨平台性能优化研究
java·开发语言·性能优化
ekkcole2 小时前
windows使用命令解压jar包,替换里面的文件。并重新打包成jar包,解决Failed to get nested archive for entry
java·windows·jar
翱翔-蓝天2 小时前
Spring Boot 3 集成 RabbitMQ 实践指南
spring boot·rabbitmq·java-rabbitmq
luckilyil2 小时前
RabbitMQ学习—day6—springboot整合
spring boot·rabbitmq·java-rabbitmq
handsomestWei2 小时前
java实现多图合成mp4和视频附件下载
java·开发语言·音视频·wutool·图片合成视频·视频附件下载