java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring Boot内置Jackson库

Spring Boot内置Jackson库的实战

作者: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,无需额外引入依赖;若为非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)

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

七、总结 📝

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

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

您可能感兴趣的文章:
阅读全文