優(yōu)雅至極!Spring Boot 3.3 中 ObjectMapper 的最佳實(shí)踐!
在企業(yè)級(jí)開發(fā)中,數(shù)據(jù)的傳輸和存儲(chǔ)越來越依賴于 JSON 格式。在前后端分離架構(gòu)中,后端通常以 JSON 格式響應(yīng)數(shù)據(jù),前端再對(duì)這些數(shù)據(jù)進(jìn)行處理。而 ObjectMapper 作為 Jackson 框架中的核心組件,是 Java 世界中用于處理 JSON 格式數(shù)據(jù)的得力工具,它提供了豐富的 API 支持,將 Java 對(duì)象與 JSON 之間的相互轉(zhuǎn)換變得簡潔、高效。
但在實(shí)際開發(fā)中,很多開發(fā)者并沒有充分利用 ObjectMapper 的靈活性和配置能力,導(dǎo)致代碼冗余且難以維護(hù)。Spring Boot 通過自動(dòng)化配置,簡化了 ObjectMapper 的使用,但為了更好地處理復(fù)雜場景,我們?nèi)匀豢梢宰远x ObjectMapper 的配置,使其更加靈活和優(yōu)雅。
本文將詳細(xì)介紹 ObjectMapper 的基本功能,并結(jié)合代碼示例,展示如何在 SpringBoot 3.3 中通過配置來定制 ObjectMapper,從而更高效地處理 JSON 數(shù)據(jù)。此外,我們將展示如何通過前端使用 jQuery 來調(diào)用返回 JSON 格式數(shù)據(jù)的接口,并在頁面上進(jìn)行動(dòng)態(tài)展示。
ObjectMapper 的詳細(xì)說明
ObjectMapper 是 Jackson 庫的核心類,它的主要功能是將 Java 對(duì)象與 JSON 格式數(shù)據(jù)進(jìn)行相互轉(zhuǎn)換。它支持以下幾種常見的操作:
- Java 對(duì)象轉(zhuǎn)換為 JSON: 通過 writeValueAsString 方法,將 Java 對(duì)象序列化為 JSON 字符串。
- JSON 轉(zhuǎn)換為 Java 對(duì)象: 使用 readValue 方法,將 JSON 字符串反序列化為 Java 對(duì)象。
- 配置自定義序列化/反序列化行為: ObjectMapper 提供了豐富的配置選項(xiàng),可以通過注解或全局配置來定制序列化和反序列化過程。例如,可以忽略某些字段、格式化輸出、修改日期格式等。
- 處理復(fù)雜數(shù)據(jù)結(jié)構(gòu): 它還支持復(fù)雜的 Java 類型,如泛型、嵌套對(duì)象、集合等,能夠靈活地將這些復(fù)雜類型與 JSON 數(shù)據(jù)相互轉(zhuǎn)換。
運(yùn)行效果:
圖片
若想獲取項(xiàng)目完整代碼以及其他文章的項(xiàng)目源碼,且在代碼編寫時(shí)遇到問題需要咨詢交流,歡迎加入下方的知識(shí)星球。
項(xiàng)目環(huán)境配置
引入依賴
首先,在 pom.xml 中引入與 Jackson、Thymeleaf、Lombok 相關(guān)的依賴:
<?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 的默認(rèn)行為可以通過 application.yml 文件進(jìn)行配置,例如設(shè)置是否美化輸出、是否忽略空字段等:
server:
port: 8080
objectmapper:
pretty-print: true
default-property-inclusion: non_null
配置 ObjectMapper
創(chuàng)建配置類
我們可以通過 @ConfigurationProperties 注解來加載配置文件中的參數(shù),并使用 Lombok 來減少冗余代碼。下面是一個(gè)簡單的 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
接著,我們可以根據(jù)上面的配置,定義一個(gè)自定義的 ObjectMapper 實(shí)例,并注冊(cè)為 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 實(shí)體類
User 實(shí)體類使用 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;
}
控制器層實(shí)現(xiàn)
我們將在控制器中使用自定義的 ObjectMapper,并提供一個(gè)返回 JSON 格式數(shù)據(jù)的接口。前端將使用 jQuery 來異步請(qǐng)求該接口并展示數(shù)據(jù)。
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 {
// 創(chuàng)建一個(gè)示例用戶對(duì)象
User user = new User("張三", 30, "北京");
// 將用戶對(duì)象轉(zhuǎn)換為 JSON 字符串
return objectMapper.writeValueAsString(user);
}
}
前端頁面展示
我們將使用 Thymeleaf 模板引擎結(jié)合 jQuery 和 Bootstrap 來構(gòu)建一個(gè)簡單的用戶頁面,并通過 AJAX 請(qǐng)求展示后端的 JSON 數(shù)據(jù)。
在 src/main/resources/templates 目錄下創(chuàng)建 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">加載用戶數(shù)據(jù)</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>
這個(gè)頁面包含一個(gè)按鈕,點(diǎn)擊后通過 jQuery 的 AJAX 請(qǐng)求從 /api/user 獲取 JSON 數(shù)據(jù),并動(dòng)態(tài)展示在頁面上。
總結(jié)
在本文中,我們展示了如何在 Spring Boot 3.3 中配置并優(yōu)雅地使用 ObjectMapper,并通過前后端配合實(shí)現(xiàn)了一個(gè)簡單的 JSON 數(shù)據(jù)展示示例。通過自定義 ObjectMapper 的配置,我們可以更靈活地處理 JSON 格式數(shù)據(jù),使代碼更加簡潔和可維護(hù)。