Spring Boot内置Jackson库的实战

 更新时间:2026年07月14日 09:58:18   作者:Moshow郑锴  
本文详解SpringBoot默认JSON库Jackson的核心优势与多格式处理技巧,通过示例代码介绍的非常详细,要的朋友们下面随着小编来一起学习学习吧

✨ 前言:在Spring Boot开发中,数据格式转换是高频场景,而Jackson作为Spring Boot默认的JSON处理库,不仅性能优异,还支持CSV、XML等多种格式的序列化与反序列化。本文将从Jackson的核心优点入手,结合具体实战示例,带你掌握它在JSON、CSV、XML三种常见格式下的使用技巧,新手也能快速上手!🚀

一、Jackson库核心优点 🌟

Jackson之所以能成为Spring Boot的默认选择,离不开以下几个关键优势,也是我们优先使用它的原因:

  • 零配置集成:Spring Boot已内置Jackson依赖(spring-boot-starter-web默认包含),无需额外引入依赖,开箱即用,极大简化开发流程。
  • 高性能&低内存占用:相比其他JSON库(如Gson),Jackson采用流式处理模式,序列化/反序列化速度更快,内存消耗更低,适合高并发场景。
  • 多格式支持:除了核心的JSON格式,通过扩展模块还能轻松支持CSV、XML、YAML等多种数据格式,一站式解决多格式转换需求。
  • 强大的定制化能力:支持自定义序列化器/反序列化器、字段命名策略、日期格式化、空值处理等,灵活适配各种业务场景。
  • 完善的类型支持:对Java基本类型、集合、泛型、枚举、复杂POJO等都有良好的支持,避免类型转换异常。

二、实战准备:环境搭建 🛠️

由于Spring Boot已内置Jackson,若使用spring-boot-starter-web,无需额外引入依赖;若为非Web项目,手动引入核心依赖即可:

<!-- Jackson核心依赖(非Web项目需引入) -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.3</version> <!-- 版本与Spring Boot兼容即可 -->
</dependency>
<!-- 支持CSV格式所需扩展依赖 -->
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-csv</artifactId>
</dependency>
<!-- 支持XML格式所需扩展依赖 -->
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

本次实战统一使用Spring Boot 2.7.x版本,Jackson版本自动适配。先定义一个通用的POJO类用于测试(用户信息):

import lombok.Data;
import java.util.Date;
//  lombok注解,简化getter/setter/构造器
@Data
public class User {
    private Long id;                // 用户ID
    private String username;        // 用户名
    private Integer age;            // 年龄
    private String email;           // 邮箱
    private Date createTime;        // 创建时间
}
// 测试数据准备
public class TestData {
    public static User getTestUser() {
        User user = new User();
        user.setId(1L);
        user.setUsername("jackson_demo");
        user.setAge(25);
        user.setEmail("demo@example.com");
        user.setCreateTime(new Date());
        return user;
    }
}

三、JSON序列化与反序列化(核心场景)📋

JSON是前后端交互的主流格式,Jackson对JSON的支持最完善。核心工具类:ObjectMapper(Spring Boot默认自动配置,可直接注入使用)。

3.1 基础序列化(POJO → JSON)

import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class JacksonJsonTest {
    // 注入Spring Boot自动配置的ObjectMapper
    @Autowired
    private ObjectMapper objectMapper;

    // 基础序列化:POJO转JSON字符串
    @Test
    public void testPojoToJson() throws Exception {
        User user = TestData.getTestUser();
        // 序列化:Object → JSON字符串
        String jsonStr = objectMapper.writeValueAsString(user);
        System.out.println("POJO转JSON结果:\n" + jsonStr);
    }
}

输出结果(日期默认转为时间戳):

{
  "id":1,
  "username":"jackson_demo",
  "age":25,
  "email":"demo@example.com",
  "createTime":1699999999999
}

3.2 基础反序列化(JSON → POJO)

// 基础反序列化:JSON字符串转POJO
@Test
public void testJsonToPojo() throws Exception {
    String jsonStr = "{"id":1,"username":"jackson_demo","age":25,"email":"demo@example.com","createTime":1699999999999}";
    // 反序列化:JSON → Object
    User user = objectMapper.readValue(jsonStr, User.class);
    System.out.println("JSON转POJO结果:\n" + user);
}

输出结果(自动映射字段,时间戳转为Date对象):

User(id=1, username=jackson_demo, age=25, email=demo@example.com, createTime=Wed Dec 24 23:59:59 CST 2025)

3.3 常用定制化配置(实战必备)

实际开发中,默认配置可能不满足需求(如日期格式、空值处理、字段命名),通过定制ObjectMapper实现:

// 定制化配置:日期格式化、空值过滤、字段命名策略
@Test
public void testCustomJsonConfig() throws Exception {
    User user = TestData.getTestUser();
    user.setEmail(null); // 模拟空值字段

    // 定制ObjectMapper配置
    ObjectMapper customObjectMapper = new ObjectMapper()
            // 日期格式化:转为yyyy-MM-dd HH:mm:ss
            .setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"))
            // 忽略空值字段
            .setSerializationInclusion(JsonInclude.Include.NON_NULL)
            // 字段命名策略:驼峰转下划线(如createTime → create_time)
            .setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);

    String jsonStr = customObjectMapper.writeValueAsString(user);
    System.out.println("定制化JSON结果:\n" + jsonStr);
}

输出结果(日期格式化、空值email字段被忽略、驼峰转下划线):

{
  "id":1,
  "username":"jackson_demo",
  "age":25,
  "create_time":"2025-12-24 23:59:59"
}

四、CSV序列化与反序列化 📊

CSV格式适合数据导出/导入场景,Jackson通过jackson-dataformat-csv模块支持CSV处理,核心工具类:CsvMapperCsvSchema(定义CSV表头和格式)。

4.1 CSV序列化(POJO列表 → CSV文件/字符串)

// CSV文件转POJO列表
@Test
public void testCsvToPojoList() throws Exception {
    // 定义CSV Schema(指定表头,用于映射POJO字段)
    CsvSchema csvSchema = csvMapper.schemaFor(User.class)
            .withHeader() // 跳过表头行(读取时忽略第一行)
            .withColumnSeparator(',');

    // 反序列化CSV文件到POJO列表
    List<User> userList = csvMapper.readerFor(User.class)
            .with(csvSchema)
            .readValues(new File("user.csv"))
            .readAll();

    System.out.println("CSV转POJO列表结果:\n" + userList);
}

输出的user.csv文件内容(含表头):

id,username,age,email,createTime1,jackson_demo,25,demo@example.com,2025-12-24 23:59:591,jackson_demo,25,demo@example.com,2025-12-24 23:59:59

4.2 CSV反序列化(CSV文件 → POJO列表)

// CSV文件转POJO列表
@Test
public void testCsvToPojoList() throws Exception {
    // 定义CSV Schema(指定表头,用于映射POJO字段)
    CsvSchema csvSchema = csvMapper.schemaFor(User.class)
            .withHeader() // 跳过表头行(读取时忽略第一行)
            .withColumnSeparator(',');

    // 反序列化CSV文件到POJO列表
    List<User> userList = csvMapper.readerFor(User.class)
            .with(csvSchema)
            .readValues(new File("user.csv"))
            .readAll();

    System.out.println("CSV转POJO列表结果:\n" + userList);
}

输出结果(成功将CSV每行数据映射为User对象):

[User(id=1, username=jackson_demo, age=25, email=demo@example.com, createTime=Wed Dec 23:59:59 CST 2025), User(id=1, username=jackson_demo, age=25, email=demo@example.com, createTime=Wed Dec 23:59:59 CST 2025)]

五、XML序列化与反序列化 📄

XML格式在传统接口、SOAP服务中仍广泛使用,Jackson通过jackson-dataformat-xml模块支持XML处理,核心工具类:XmlMapper

5.1 XML序列化(POJO → XML字符串/文件)

import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import org.junit.Test;

import java.io.File;

public class JacksonXmlTest {
    private final XmlMapper xmlMapper = new XmlMapper();

    // POJO转XML字符串(带根节点)
    @Test
    public void testPojoToXml() throws Exception {
        User user = TestData.getTestUser();

        // 定制XML配置:日期格式化
        xmlMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

        // 序列化到XML字符串
        String xmlStr = xmlMapper.writerWithDefaultPrettyPrinter().writeValueAsString(user);
        System.out.println("POJO转XML结果:\n" + xmlStr);

        // 序列化到XML文件
        xmlMapper.writerWithDefaultPrettyPrinter()
                .writeValue(new File("user.xml"), user);
    }
}

输出的XML字符串(格式化后,带根节点<User>):

<User>
  <id>1</id>
  <username>jackson_demo</username>
  <age>25</age>
  <email>demo@example.com</email>
  <createTime>2025-12-24 23:59:59</createTime>
</User>

5.2 XML反序列化(XML字符串 → POJO)

// XML字符串转POJO
@Test
public void testXmlToPojo() throws Exception {
    String xmlStr = "<User>" +
            "<id>1</id>" +
            "<username>jackson_demo</username>" +
            "<age>25</age>" +
            "<email>demo@example.com</email>" +
            "<createTime>2025-12-24 23:59:59</createTime>" +
            "</User>";
    // 反序列化XML到POJO
    User user = xmlMapper.readValue(xmlStr, User.class);
    System.out.println("XML转POJO结果:\n" + user);
}

输出结果(成功映射XML节点到POJO字段):

User(id=1, username=jackson_demo, age=25, email=demo@example.com, createTime=Wed Dec 24 23:59:59 CST 2025)

六、常见问题与注意事项 ⚠️

  • 📌 日期格式问题:默认情况下,Jackson会将Date转为时间戳,建议统一配置日期格式化(如yyyy-MM-dd HH:mm:ss),避免前后端格式不一致。
  • 📌 空值处理:通过JsonInclude.Include.NON_NULL忽略空值字段,减少数据传输量,避免前端解析异常。
  • 📌 字段映射问题:若JSON/XML字段名与POJO字段名不一致,可使用@JsonProperty("字段名")注解指定映射关系。
  • 📌 CSV表头顺序:默认按POJO字段定义顺序,若需自定义顺序,可通过CsvSchema.Builder手动指定列顺序。
  • 📌 XML根节点:默认根节点为POJO类名(首字母大写),可通过@JacksonXmlRootElement(localName = "根节点名")自定义根节点。

七、总结 📝

本文详细介绍了Spring Boot内置Jackson库的核心优点,并通过实战示例演示了其在JSON、CSV、XML三种主流格式下的序列化与反序列化用法,包括基础操作和定制化配置。Jackson作为Spring Boot的“原生”数据转换工具,具有零配置、高性能、多格式支持等优势,掌握它能极大提升数据转换场景的开发效率。

到此这篇关于Spring Boot内置Jackson库的实战的文章就介绍到这了,更多相关Spring Boot内置Jackson库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring security需求分析与基础环境准备教程

    spring security需求分析与基础环境准备教程

    这篇文章主要为大家介绍了spring security需求分析与基础环境准备教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • 简单谈谈java自定义注解

    简单谈谈java自定义注解

    下面小编就为大家带来一篇简单谈谈java自定义注解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Spring Boot项目中使用OpenAI-Java的示例详解

    Spring Boot项目中使用OpenAI-Java的示例详解

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程,这篇文章主要介绍了Spring Boot项目中使用OpenAI-Java的示例详解,需要的朋友可以参考下
    2023-04-04
  • java数据结构图论霍夫曼树及其编码示例详解

    java数据结构图论霍夫曼树及其编码示例详解

    这篇文章主要为大家介绍了java数据结构图论霍夫曼树及其编码示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-11-11
  • SpringBoot中短时间连续请求时出现Cookie获取异常问题的解决方案

    SpringBoot中短时间连续请求时出现Cookie获取异常问题的解决方案

    在 Spring Boot Web 应用中,每个请求都会携带 HttpServletRequest,其中包含 Cookie 等关键信息,如果某个请求对象的 cookieParsed 标记在异步线程中被错误修改,可能会导致 短时间内的后续请求无法正确解析 Cookie,本文给大家介绍了详细解决方法,需要的朋友可以参考下
    2025-04-04
  • SpringBoot中的@Inherited注解详解

    SpringBoot中的@Inherited注解详解

    这篇文章主要介绍了SpringBoot中的@Inherited注解详解,@Inherited是一个标识,用来修饰注解,如果一个类用上了@Inherited修饰的注解,那么其子类也会继承这个注解,需要的朋友可以参考下
    2023-08-08
  • java CompletableFuture异步任务编排示例详解

    java CompletableFuture异步任务编排示例详解

    这篇文章主要为大家介绍了java CompletableFuture异步任务编排示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Java 生成带Logo和文字的二维码

    Java 生成带Logo和文字的二维码

    这篇文章主要介绍了Java 生成带Logo和文字的二维码的方法,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-04-04
  • SpringBoot中如何启动Tomcat流程

    SpringBoot中如何启动Tomcat流程

    这篇文章主要介绍了SpringBoot中如何启动Tomcat流程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • SpringBoot前后端接口对接常见错误小结

    SpringBoot前后端接口对接常见错误小结

    SpringBoot前后端接口对接工作时,经常遇到请求500,400等问题,本文主要介绍了SpringBoot前后端接口对接常见错误小结,感兴趣的可以了解一下
    2022-01-01

最新评论