RuoYi-Vue-Plus功能分析-jackson配置

文章目錄

  • 前言
  • 一、配置文件
  • 二、配置類
  • 三、注解
  • 四、json工具類
    • 1. 工具內容
    • 2. 使用工具


前言

前端在給我發送請求的時候一般包含三個部分url,header,body。那么就會涉及我們后端如何接收這些請求參數并且我們處理完畢參數后前端又如何接收參數

通過url傳遞參數一般情況我們不需要序列化/反序列化處理,而通過body傳遞的參數我們就需要**反序列化**處理。處理完畢后參數返回給前端就是**序列化**

一、配置文件

在rouyi-admin的application.yml文件中配置了如下內容

spring:jackson:# 日期格式化date-format: yyyy-MM-dd HH:mm:ssserialization:# 格式化輸出indent_output: false# 忽略無法轉換的對象fail_on_empty_beans: falsedeserialization:# 允許對象忽略json中不存在的屬性fail_on_unknown_properties: false

二、配置類

位于package com.ruoyi.framework.config添加如下配置并且交給bean管理

@Slf4j
@Configuration
public class JacksonConfig {@Beanpublic Jackson2ObjectMapperBuilderCustomizer customizer() {return builder -> {// 全局配置序列化返回 JSON 處理JavaTimeModule javaTimeModule = new JavaTimeModule();javaTimeModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE);javaTimeModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE);javaTimeModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE);javaTimeModule.addSerializer(BigDecimal.class, ToStringSerializer.instance);DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter));javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter));builder.modules(javaTimeModule);builder.timeZone(TimeZone.getDefault());log.info("初始化 jackson 配置");};}
}

三、注解

如果配置的無法滿足需求可以通過注解的方式解決

/*** 搜索值*/
@JsonIgnore	// 不進行序列化與反序列化處理
@TableField(exist = false)
private String searchValue;
/**
* 請求參數
*/
@JsonInclude(JsonInclude.Include.NON_EMPTY) // 只要非空的時候進行序列化與反序列化處理
@TableField(exist = false)
private Map<String, Object> params = new HashMap<>();
@JsonIgnore
@JsonProperty	// 指定別名
public String getPassword() {return password;
}
@JsonFormat(pattern = "yyyy-MM-dd") // 指定日期序列化與反序列化格式格式

四、json工具類

1. 工具內容

位于package com.ruoyi.common.utils;包下

/*** JSON 工具類** @author 芋道源碼*/
// 生成一個私有的無參構造函數
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class JsonUtils {// 創建OBJECT_MAPPER實例對象private static final ObjectMapper OBJECT_MAPPER = SpringUtils.getBean(ObjectMapper.class);// 獲取OBJECT_MAPPER實例對象public static ObjectMapper getObjectMapper() {return OBJECT_MAPPER;}// 將對象轉換為字符串public static String toJsonString(Object object) {if (ObjectUtil.isNull(object)) {return null;}try {return OBJECT_MAPPER.writeValueAsString(object);} catch (JsonProcessingException e) {throw new RuntimeException(e);}}// 將字符串轉換為對象public static <T> T parseObject(String text, Class<T> clazz) {if (StringUtils.isEmpty(text)) {return null;}try {return OBJECT_MAPPER.readValue(text, clazz);} catch (IOException e) {throw new RuntimeException(e);}}// 將字節數組轉換為對象public static <T> T parseObject(byte[] bytes, Class<T> clazz) {if (ArrayUtil.isEmpty(bytes)) {return null;}try {return OBJECT_MAPPER.readValue(bytes, clazz);} catch (IOException e) {throw new RuntimeException(e);}}//  將字符串轉換為對象(使用TypeReference)public static <T> T parseObject(String text, TypeReference<T> typeReference) {if (StringUtils.isBlank(text)) {return null;}try {return OBJECT_MAPPER.readValue(text, typeReference);} catch (IOException e) {throw new RuntimeException(e);}}// 將字符串轉換為字典使用比hashmap更簡單public static Dict parseMap(String text) {if (StringUtils.isBlank(text)) {return null;}try {return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructType(Dict.class));} catch (MismatchedInputException e) {// 類型不匹配說明不是jsonreturn null;} catch (IOException e) {throw new RuntimeException(e);}}// 將字符串轉換為字典列表public static List<Dict> parseArrayMap(String text) {if (StringUtils.isBlank(text)) {return null;}try {return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, Dict.class));} catch (IOException e) {throw new RuntimeException(e);}}// 將字符串轉換為對象列表public static <T> List<T> parseArray(String text, Class<T> clazz) {if (StringUtils.isEmpty(text)) {return new ArrayList<>();}try {return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, clazz));} catch (IOException e) {throw new RuntimeException(e);}}}

2. 使用工具

測試getObjectMapper方法

@RestController
@RequestMapping("/demo/test")
@SaIgnore // 忽略校驗
public class TestController {@GetMapping("JsonUtils")public void testGetObjectMapper(){// 獲取objectMapper ObjectMapper objectMapper = JsonUtils.getObjectMapper();// 打印Console.log("objectMapper,{}",objectMapper);}
}

在這里插入圖片描述

測試toJsonString方法,將對象轉換為字符串

    @GetMapping("JsonUtils")public void testGetObjectMapper(){// 創建對象User user = new User("張三" , 18);// 序列化String str = JsonUtils.toJsonString(user);Console.log(str);}

在這里插入圖片描述

測試parseObject方法,將字符串轉換對象

    @GetMapping("JsonUtils")public void testGetObjectMapper(){// 創建jsonString json="{\"name\":\"張三\",\"age\":18}";// 反序列化User user = JsonUtils.parseObject(json, User.class);Console.log(user);}

在這里插入圖片描述

測試parseObject方法,將字節數組轉換對象

    @GetMapping("JsonUtils")public void testGetObjectMapper(){// 創建jsonString json="{\"name\":\"張三\",\"age\":18}";// 反序列化User user = JsonUtils.parseObject(StrUtil.utf8Bytes(json), User.class);Console.log(user);}

在這里插入圖片描述

測試parseObject方法,將字符串轉換為復雜類型

    @GetMapping("JsonUtils")public void testGetObjectMapper(){// 創建jsonString json="[{\"name\":\"張三\",\"age\":18}]";// 反序列化List<User> users = JsonUtils.parseObject(json, new TypeReference<List<User>>() {});Console.log(users);}

在這里插入圖片描述

測試parseMap方法,將字符串轉換字典,Dict繼承了LinkedHashMap對其做了進一步增強

    @GetMapping("JsonUtils")public void testGetObjectMapper(){// 創建jsonString json="{\"name\":\"張三\",\"age\":18}";// 反序列化Dict dict = JsonUtils.parseMap(json);if (dict != null) {Console.log(dict.get("name"));}}

在這里插入圖片描述

測試parseArrayMap方法,將字符串轉換字典列表,Dict繼承了LinkedHashMap對其做了進一步增強

    @GetMapping("JsonUtils")public void testGetObjectMapper(){// 創建jsonString json="[{\"name\":\"張三\",\"age\":18}]";// 反序列化List<Dict> dictList = JsonUtils.parseArrayMap(json);if (CollectionUtil.isNotEmpty(dictList)) {for (Dict dict : dictList) {Console.log("name: {}, age: {}", dict.getStr("name"), dict.getInt("age"));}}}

在這里插入圖片描述

測試parseArrayMap方法,將字符串轉換字典列表

    @GetMapping("JsonUtils")public void testGetObjectMapper(){// 創建jsonString json="[{\"name\":\"張三\",\"age\":18}]";// 反序列化List<User> userList = JsonUtils.parseArray(json, User.class);if (CollectionUtil.isNotEmpty(userList)) {for (User user : userList) {Console.log("name: {}, age: {}", user.getName(), user.getAge());}}}

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713714.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713714.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713714.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

代碼隨想錄刷題筆記 DAY 37 | 動態規劃理論基礎 | 斐波那契數 No.509 | 爬樓梯 No.70 | 使用最小花費爬樓梯 No.746

文章目錄 Day 3700. 動態規劃理論基礎01. 斐波那契數&#xff08;No. 509&#xff09;<1> 題目<2> 筆記<3> 代碼 02. 爬樓梯&#xff08;No. 70&#xff09;<1> 題目<2> 筆記<3> 代碼 03. 使用最小花費爬樓梯&#xff08;No. 746&#xff…

ECMAScript-262 @2023版本中的關鍵字和保留字

1、什么是標識符&#xff1f; 所謂標識符&#xff0c;就是javascript里的變量、函數、屬性或函數參數的名稱&#xff0c;可由一個或多個字符組成&#xff0c;當然標識符有命名規范 標識符第一個字符必須是 一個字母、下劃線&#xff08;_&#xff09;或美元符號&#xff08;$…

ONLYOFFICE文檔8.0全新發布:私有部署、卓越安全的協同辦公解決方案

ONLYOFFICE文檔8.0全新發布&#xff1a;私有部署、卓越安全的協同辦公解決方案 文章目錄 ONLYOFFICE文檔8.0全新發布&#xff1a;私有部署、卓越安全的協同辦公解決方案摘要&#x1f4d1;引言 &#x1f31f;正文&#x1f4da;一、ONLYOFFICE文檔概述 &#x1f4ca;二、ONLYOFFI…

【新書推薦】10.2 分支程序設計

稍微復雜一些的程序通常需要做某種條件判斷&#xff0c;然后再決定程序的執行流程。當然也可以無條件跳轉到程序的另一處地址開始執行。本節我們將詳細介紹分支結構的程序設計方法。 針對功能較為復雜的程序&#xff0c;程序開發有一套標準的流程&#xff0c;我們將10.1節中的五…

計算機網絡【網絡安全】

計算機網絡——網絡安全 一、網絡安全問題概述 網絡安全威脅 網絡安全面臨兩大類威脅&#xff0c;被動攻擊和主動攻擊 被動攻擊 指攻擊者從網絡上竊聽他人的通信內容&#xff0c;通常把這類攻擊稱為截獲。 主動攻擊 篡改 攻擊者故意篡改網絡上傳送的報文 惡意程序 拒絕服…

InnoDB索引與優化篇(5)-InnoDB中的查詢優化策略

InnoDB是MySQL數據庫中一種常用的存儲引擎&#xff0c;它具有高性能和可靠性。查詢優化是數據庫開發中非常重要的一環&#xff0c;它能夠幫助我們提高數據庫查詢的效率和性能。在本篇博客中&#xff0c;我們將介紹一些在使用InnoDB存儲引擎時進行查詢優化的常用策略&#xff0c…

貪心 Leetcode 455 分發餅干

分發餅干 Leetcode 455 學習記錄自代碼隨想錄 假設你是一位很棒的家長&#xff0c;想要給你的孩子們一些小餅干。但是&#xff0c;每個孩子最多只能給一塊餅干。 對每個孩子 i&#xff0c;都有一個胃口值 g[i]&#xff0c;這是能讓孩子們滿足胃口的餅干的最小尺寸&#xff1…

神經網絡算法:卷積神經網絡

神經網絡算法&#xff0c;也稱為人工神經網絡算法&#xff0c;是一種模仿人腦神經網絡結構和功能的計算模型。它由多個神經元相互連接而成的網絡組成&#xff0c;每個神經元都有輸入和輸出&#xff0c;并通過學習算法來調整連接權重&#xff0c;從而實現對輸入數據的模式識別和…

JavaScript Web Socket 詳解

Web Socket ? Web Socket&#xff08;套接字&#xff09;的目標是通過一個長時連接實現與服務器全雙工、雙向的通信。在 JavaScript 中創建 Web Socket 時&#xff0c;一個 HTTP 請求會發送到服務器以初始化連接。服務器響應后&#xff0c;連接使用 HTTP 的 Upgrade 頭部從 H…

12、窗口看門狗

目錄 1、窗口看門狗概述 2、常用寄存器和庫函數配置 3、窗口看門狗實驗 1、窗口看門狗概述 之所以稱為窗口就是因為其喂狗時間是一個有上下限的范圍內&#xff08;窗口&#xff09;&#xff0c;你可以通過設定相關寄存器&#xff0c;設定其上限時間&#xff08;下限固定&…

數據結構 棧和隊列 力扣例題AC——代碼以及思路記錄

20. 有效的括號 給定一個只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判斷字符串是否有效。 有效字符串需滿足&#xff1a; 左括號必須用相同類型的右括號閉合。左括號必須以正確的順序閉合。每個右括號都有一個對應…

mysql使用連接池

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、mysql連接池&#xff1f;二、使用步驟1.引入庫 前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&#xff1a; 例如&#xff1a; 提示&#xff1a…

深入理解Flutter中的StreamSubscription和StreamController

在Flutter中&#xff0c;StreamSubscription和StreamController是處理異步數據流的重要工具。它們提供了一種方便的方式來處理來自異步事件源的數據。本文將深入探討它們的區別以及在實際應用中的使用場景。 StreamSubscription StreamSubscription代表了對數據流的訂閱&…

代碼隨想錄算法訓練營番外 刷題日記0301 || 29、兩數相除,31、下一個排列

29、兩數相除 思路&#xff1a;不斷相減就是求解的最直接方法&#xff0c;我這樣計算時間復雜度有點高 // 時間復雜度O(count*divisor) // 空間復雜度O(1)class Solution {int res 0;public int divide(int dividend, int divisor) {// dividend 是被除數if(dividend 0) …

技術棧選型的時候,ruby、go、java、vue、react應該怎么選擇?

選擇適合項目需求、團隊技術背景和偏好、開發速度、性能要求以及可擴展性的技術棧和框架是一個綜合考慮的過程&#xff0c;沒有一種通用的最佳選擇&#xff0c;取決于具體情況。 選擇Vue.js或React應該綜合考慮項目的需求、團隊的技術背景和偏好、生態系統的支持和發展趨勢等因…

隨記-點選驗證碼

文字驗證碼&#xff08;點擊文字&#xff09; 模板匹配&#xff08;從一張圖片中尋找 icon&#xff09;&#xff0c;放棄&#xff0c;目前準確率不高&#xff0c;且處理過程復雜 灰度處理將 complete_image_path 截取并另存為 target_image_path&#xff0c; verify_image_path…

WPF真入門教程30--順風物流單據管理系統

1、教程回顧 到現在為止&#xff0c;真入門系列教程已完成了29刺由淺入深地講解&#xff0c;當然不可能講到了WPF的所有技能點&#xff0c;但讀者看到了wpf的內部各種功能及之間的聯系&#xff0c;在此基礎上&#xff0c;提供一個完整有效的綜合項目&#xff0c;本項目采用的是…

c++知識點之 --this

在成員函數中存在。struct和class每個成員函數都隱含一個名為this的指針形參&#xff0c;并且它是該成員函數的第一個參數&#xff0c;當某個對象調用成員函數時&#xff0c;就會把該對象的地址傳給被調用成員函數的隱式形參this。 this是一個指針 &#xff0c;存放的是當前對象…

加密與安全_深入了解Hmac算法(消息認證碼)

文章目錄 PreHMAC概述常見的Hmac算法Code隨機的key的生成 KeyGeneratorHmacMD5用Hmac算法取代原有的自定義的加鹽算法 HmacMD5 VS MD5HmacSHA256 Pre 加密與安全_深入了解哈希算法中我們提到&#xff0c; 存儲用戶的哈希口令時&#xff0c;要加鹽存儲&#xff0c;目的就在于抵…

操作系統系列學習——CPU管理的直觀想法

文章目錄 前言CPU管理的直觀想法 前言 一個本碩雙非的小菜雞&#xff0c;備戰24年秋招&#xff0c;計劃學習操作系統并完成6.0S81&#xff0c;加油&#xff01; 本文總結自B站【哈工大】操作系統 李治軍&#xff08;全32講&#xff09; 老師課程講的非常好&#xff0c;感謝 【…