優雅至極!Spring Boot 3.3 中 ObjectMapper 的最佳實踐!
在企業級開發中,數據的傳輸和存儲越來越依賴于 JSON 格式。在前后端分離架構中,后端通常以 JSON 格式響應數據,前端再對這些數據進行處理。而 ObjectMapper 作為 Jackson 框架中的核心組件,是 Java 世界中用于處理 JSON 格式數據的得力工具,它提供了豐富的 API 支持,將 Java 對象與 JSON 之間的相互轉換變得簡潔、高效。
但在實際開發中,很多開發者并沒有充分利用 ObjectMapper 的靈活性和配置能力,導致代碼冗余且難以維護。Spring Boot 通過自動化配置,簡化了 ObjectMapper 的使用,但為了更好地處理復雜場景,我們仍然可以自定義 ObjectMapper 的配置,使其更加靈活和優雅。
本文將詳細介紹 ObjectMapper 的基本功能,并結合代碼示例,展示如何在 SpringBoot 3.3 中通過配置來定制 ObjectMapper,從而更高效地處理 JSON 數據。此外,我們將展示如何通過前端使用 jQuery 來調用返回 JSON 格式數據的接口,并在頁面上進行動態展示。
ObjectMapper 的詳細說明
ObjectMapper 是 Jackson 庫的核心類,它的主要功能是將 Java 對象與 JSON 格式數據進行相互轉換。它支持以下幾種常見的操作:
- Java 對象轉換為 JSON: 通過 writeValueAsString 方法,將 Java 對象序列化為 JSON 字符串。
- JSON 轉換為 Java 對象: 使用 readValue 方法,將 JSON 字符串反序列化為 Java 對象。
- 配置自定義序列化/反序列化行為: ObjectMapper 提供了豐富的配置選項,可以通過注解或全局配置來定制序列化和反序列化過程。例如,可以忽略某些字段、格式化輸出、修改日期格式等。
- 處理復雜數據結構: 它還支持復雜的 Java 類型,如泛型、嵌套對象、集合等,能夠靈活地將這些復雜類型與 JSON 數據相互轉換。
運行效果:
圖片
若想獲取項目完整代碼以及其他文章的項目源碼,且在代碼編寫時遇到問題需要咨詢交流,歡迎加入下方的知識星球。
項目環境配置
引入依賴
首先,在 pom.xml 中引入與 Jackson、Thymeleaf、Lombok 相關的依賴:
<?xml versinotallow="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>3.3.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.icoderoad</groupId>
<artifactId>objectmapper</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>objectmapper</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Thymeleaf 模板引擎 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- Jackson JSON 處理 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</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>
</plugin>
</plugins>
</build>
</project>
application.yml 配置文件
ObjectMapper 的默認行為可以通過 application.yml 文件進行配置,例如設置是否美化輸出、是否忽略空字段等:
server:
port: 8080
objectmapper:
pretty-print: true
default-property-inclusion: non_null
配置 ObjectMapper
創建配置類
我們可以通過 @ConfigurationProperties 注解來加載配置文件中的參數,并使用 Lombok 來減少冗余代碼。下面是一個簡單的 ObjectMapperConfig 配置類:
package com.icoderoad.objectmapper.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
@Configuration
@ConfigurationProperties(prefix = "objectmapper")
@Data
public class ObjectMapperProperties {
private boolean prettyPrint;
private JsonInclude.Include defaultPropertyInclusion;
}
定義 ObjectMapper Bean
接著,我們可以根據上面的配置,定義一個自定義的 ObjectMapper 實例,并注冊為 Spring 的 Bean:
package com.icoderoad.objectmapper.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.fasterxml.jackson.databind.ObjectMapper;
@Configuration
public class JacksonConfig {
private final ObjectMapperProperties objectMapperProperties;
public JacksonConfig(ObjectMapperProperties objectMapperProperties) {
this.objectMapperProperties = objectMapperProperties;
}
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
// 是否格式化輸出
if (objectMapperProperties.isPrettyPrint()) {
objectMapper.writerWithDefaultPrettyPrinter();
}
// 配置屬性包含策略
objectMapper.setSerializationInclusion(objectMapperProperties.getDefaultPropertyInclusion());
return objectMapper;
}
}
User 實體類
User 實體類使用 Lombok 簡化代碼:
package com.icoderoad.objectmapper.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String name;
private int age;
private String city;
}
控制器層實現
我們將在控制器中使用自定義的 ObjectMapper,并提供一個返回 JSON 格式數據的接口。前端將使用 jQuery 來異步請求該接口并展示數據。
package com.icoderoad.objectmapper.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.icoderoad.objectmapper.entity.User;
@RestController
public class UserController {
private final ObjectMapper objectMapper;
public UserController(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
@GetMapping("/api/user")
public String getUser() throws JsonProcessingException {
// 創建一個示例用戶對象
User user = new User("張三", 30, "北京");
// 將用戶對象轉換為 JSON 字符串
return objectMapper.writeValueAsString(user);
}
}
前端頁面展示
我們將使用 Thymeleaf 模板引擎結合 jQuery 和 Bootstrap 來構建一個簡單的用戶頁面,并通過 AJAX 請求展示后端的 JSON 數據。
在 src/main/resources/templates 目錄下創建 index.html 文件:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>用戶信息</title>
<link rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="container">
<h1 class="mt-5">用戶信息</h1>
<button id="loadUser" class="btn btn-primary">加載用戶數據</button>
<pre id="userJson" class="bg-light p-3 mt-3"></pre>
</div>
<script>
$(document).ready(function () {
$('#loadUser').click(function () {
$.ajax({
url: '/api/user',
method: 'GET',
success: function (data) {
$('#userJson').text(JSON.stringify(JSON.parse(data), null, 4));
}
});
});
});
</script>
</body>
</html>
這個頁面包含一個按鈕,點擊后通過 jQuery 的 AJAX 請求從 /api/user 獲取 JSON 數據,并動態展示在頁面上。
總結
在本文中,我們展示了如何在 Spring Boot 3.3 中配置并優雅地使用 ObjectMapper,并通過前后端配合實現了一個簡單的 JSON 數據展示示例。通過自定義 ObjectMapper 的配置,我們可以更靈活地處理 JSON 格式數據,使代碼更加簡潔和可維護。