解決一個(gè)JSON反序列化問題的辦法(空字符串變?yōu)榭占?
1.問題場(chǎng)景
當(dāng)我后端實(shí)體中定義如下:
private List<String> projectTypeId;
如果前端傳projectTypeId 是 null 或者 [] 都是沒問題的。當(dāng)前端傳"" 則會(huì)報(bào)錯(cuò)。 報(bào)錯(cuò)如下:
Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot coerce empty String ("") to element of `java.util.ArrayList<java.lang.String>` (but could if coercion was enabled using `CoercionConfig`)
at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 8, column: 22] (through reference chain: com.safesoft.web.landProject.vo.LandProjectQueryVO["projectTypeId"])
意思是無法將空字符串強(qiáng)轉(zhuǎn)為集合
2.解決辦法(前端)
前端把“” 變?yōu)閚ull或者[]即可
(但是我所在這個(gè)項(xiàng)目,原先定義的是 private String projectTypeId; 前端傳"" 也沒毛病,但是后期更改需求,需要變成集合。但是前端每個(gè)人寫的語法不一樣,上個(gè)前端人員如果是null則傳的"" 。因此造成這個(gè)bug)
3.解決辦法(后端)
3.1 編寫一個(gè)自定義 JSON 反序列化器 EmptyStringListDeserializer
package com.safesoft.common.config;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* 自定義 JSON 反序列化器,用于處理空字符串在 List 中的情況。
* 該反序列化器設(shè)計(jì)用于與 Java 類中的 `@JsonDeserialize` 注解一起使用,該注解放在 List<String> 字段上。
* @author Kevin.Wan
* @date 2023/12/15
**/
public class EmptyStringListDeserializer extends JsonDeserializer<List<String>> {
/**
* 反序列化 JSON 數(shù)組,處理空字符串并將其轉(zhuǎn)換為空列表。
*
* @param p JSON 解析器。
* @param ctxt 反序列化上下文。
* @return 包含反序列化字符串的 List<String>。
* @throws IOException 如果在反序列化過程中發(fā)生 I/O 錯(cuò)誤。
*/
@Override
public List<String> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
// 讀取整個(gè) JSON 節(jié)點(diǎn)
JsonNode node = p.readValueAsTree();
// 檢查節(jié)點(diǎn)是否為 null、缺失或不是數(shù)組
if (node == null || node.isNull() || node.isMissingNode() || !node.isArray()) {
// 對(duì)于 null、缺失或非數(shù)組情況,返回空列表
return new ArrayList<>();
} else {
// 處理數(shù)組中的每個(gè)元素
List<String> values = new ArrayList<>();
for (JsonNode element : node) {
// 檢查元素是否為文本節(jié)點(diǎn)
if (element.isTextual()) {
// 將文本值添加到列表中
values.add(element.textValue());
}
}
// 返回反序列化字符串的列表
return values;
}
}
}
3.2 然后在可能存在空字符串轉(zhuǎn)換集合的實(shí)體上 添加注解
/** * 項(xiàng)目類型id */ @JsonDeserialize(using = EmptyStringListDeserializer.class) private List<String> projectTypeId;
@JsonDeserialize
是在反序列化時(shí),所以就是對(duì)參數(shù)進(jìn)行封裝,故到的是 setXxxx() 方法,所以需要將注解添加到對(duì)應(yīng)的 set 方法上,若使用了 Lombok 需要自己定義相應(yīng)的 set 方法。
需要使用 using 屬性指定處理參數(shù)的類,該類需要繼承 JsonDeserializer 類,并重寫 deserialize()。
自己見解:
@JsonDeserialize是String提供的反序列化注解,其中 using可以自定義一個(gè)反序列化,EmptyStringListDeserializer則是我們自定義處理空字符串轉(zhuǎn)換為空集合的反序列化器
總結(jié)
到此這篇關(guān)于解決一個(gè)JSON反序列化問題的文章就介紹到這了,更多相關(guān)JSON反序列化問題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解讀@Scheduled任務(wù)調(diào)度/定時(shí)任務(wù)非分布式
這篇文章主要介紹了解讀@Scheduled任務(wù)調(diào)度/定時(shí)任務(wù)非分布式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
Java使用JaCoCo進(jìn)行代碼覆蓋率分析的操作指南
JaCoCo是一個(gè)開源的 Java 代碼覆蓋率工具,廣泛應(yīng)用于測(cè)試過程中,它可以幫助開發(fā)者分析測(cè)試代碼的覆蓋情況,在本文中,我們將介紹 JaCoCo 的基本功能、如何集成到 Maven 項(xiàng)目中,以及通過具體案例展示如何生成覆蓋率報(bào)告,需要的朋友可以參考下2025-02-02
SpringBoot的父級(jí)依賴:spring-boot-starter-parent詳解
SpringBoot通過父級(jí)依賴spring-boot-starter-parent實(shí)現(xiàn)項(xiàng)目快速構(gòu)建,它依賴于spring-boot-dependencies來統(tǒng)一管理項(xiàng)目中的依賴版本,省去了手動(dòng)指定版本信息的麻煩,這種機(jī)制不僅規(guī)定了默認(rèn)的Java版本和編碼格式2024-09-09
詳解Spring Boot實(shí)現(xiàn)日志記錄 SLF4J
本篇文章主要介紹了詳解Spring Boot實(shí)現(xiàn)日志記錄 SLF4J,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05
Java Arrays.sort()如何實(shí)現(xiàn)對(duì)int類型數(shù)組倒序排序
這篇文章主要介紹了Java Arrays.sort()如何實(shí)現(xiàn)對(duì)int類型數(shù)組倒序排序問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
SpringBoot部署和前端連接問題解決的完整指南(net::ERR_CONNECTION_REFUSED)
在開發(fā)和部署 Spring Boot 應(yīng)用時(shí),可能會(huì)遇到各種問題,例如 JAR 文件無法運(yùn)行、前端無法連接后端服務(wù)等,本文將詳細(xì)總結(jié)這些問題的解決方法,幫助你順利部署和運(yùn)行 Spring Boot 應(yīng)用,需要的朋友可以參考下2025-01-01
詳解Java TCC分布式事務(wù)實(shí)現(xiàn)原理
這篇文章主要介紹了詳解Java TCC分布式事務(wù)實(shí)現(xiàn)原理,對(duì)分布式事務(wù)感興趣的同學(xué),一定要看一下2021-04-04

