最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決一個JSON反序列化問題的辦法(空字符串變?yōu)榭占?

 更新時間:2024年03月06日 10:28:50   作者:小萬是個程序員  
在平時的業(yè)務(wù)開發(fā)中,經(jīng)常會有拿到一串序列化后的字符串要來反序列化,下面這篇文章主要給大家介紹了如何解決一個JSON反序列化問題的相關(guān)資料,空字符串變?yōu)榭占?需要的朋友可以參考下

1.問題場景

當我后端實體中定義如下:

private List<String> projectTypeId;

如果前端傳projectTypeId 是 null 或者 [] 都是沒問題的。當前端傳"" 則會報錯。 報錯如下:

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"])

意思是無法將空字符串強轉(zhuǎn)為集合

2.解決辦法(前端)

前端把“” 變?yōu)閚ull或者[]即可

(但是我所在這個項目,原先定義的是 private String projectTypeId; 前端傳"" 也沒毛病,但是后期更改需求,需要變成集合。但是前端每個人寫的語法不一樣,上個前端人員如果是null則傳的"" 。因此造成這個bug)

3.解決辦法(后端)

3.1 編寫一個自定義 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è)計用于與 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 錯誤。
     */
    @Override
    public List<String> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        // 讀取整個 JSON 節(jié)點
        JsonNode node = p.readValueAsTree();
        // 檢查節(jié)點是否為 null、缺失或不是數(shù)組
        if (node == null || node.isNull() || node.isMissingNode() || !node.isArray()) {
            // 對于 null、缺失或非數(shù)組情況,返回空列表
            return new ArrayList<>();
        } else {
            // 處理數(shù)組中的每個元素
            List<String> values = new ArrayList<>();
            for (JsonNode element : node) {
                // 檢查元素是否為文本節(jié)點
                if (element.isTextual()) {
                    // 將文本值添加到列表中
                    values.add(element.textValue());
                }
            }
            // 返回反序列化字符串的列表
            return values;
        }
    }
}

3.2 然后在可能存在空字符串轉(zhuǎn)換集合的實體上 添加注解

/**
 * 項目類型id
 */
@JsonDeserialize(using = EmptyStringListDeserializer.class)
private List<String> projectTypeId;

@JsonDeserialize

是在反序列化時,所以就是對參數(shù)進行封裝,故到的是 setXxxx() 方法,所以需要將注解添加到對應(yīng)的 set 方法上,若使用了 Lombok 需要自己定義相應(yīng)的 set 方法。

需要使用 using 屬性指定處理參數(shù)的類,該類需要繼承 JsonDeserializer 類,并重寫 deserialize()。

自己見解:

@JsonDeserialize是String提供的反序列化注解,其中 using可以自定義一個反序列化,EmptyStringListDeserializer則是我們自定義處理空字符串轉(zhuǎn)換為空集合的反序列化器

總結(jié)

到此這篇關(guān)于解決一個JSON反序列化問題的文章就介紹到這了,更多相關(guān)JSON反序列化問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解讀@Scheduled任務(wù)調(diào)度/定時任務(wù)非分布式

    解讀@Scheduled任務(wù)調(diào)度/定時任務(wù)非分布式

    這篇文章主要介紹了解讀@Scheduled任務(wù)調(diào)度/定時任務(wù)非分布式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java使用JaCoCo進行代碼覆蓋率分析的操作指南

    Java使用JaCoCo進行代碼覆蓋率分析的操作指南

    JaCoCo是一個開源的 Java 代碼覆蓋率工具,廣泛應(yīng)用于測試過程中,它可以幫助開發(fā)者分析測試代碼的覆蓋情況,在本文中,我們將介紹 JaCoCo 的基本功能、如何集成到 Maven 項目中,以及通過具體案例展示如何生成覆蓋率報告,需要的朋友可以參考下
    2025-02-02
  • SpringBoot的父級依賴:spring-boot-starter-parent詳解

    SpringBoot的父級依賴:spring-boot-starter-parent詳解

    SpringBoot通過父級依賴spring-boot-starter-parent實現(xiàn)項目快速構(gòu)建,它依賴于spring-boot-dependencies來統(tǒng)一管理項目中的依賴版本,省去了手動指定版本信息的麻煩,這種機制不僅規(guī)定了默認的Java版本和編碼格式
    2024-09-09
  • Java反射和動態(tài)代理的使用解讀

    Java反射和動態(tài)代理的使用解讀

    這篇文章主要介紹了Java反射和動態(tài)代理的概念、使用方法和應(yīng)用場景,反射允許在運行時動態(tài)地獲取類的信息和調(diào)用類的方法,而動態(tài)代理則可以在不修改原有代碼的情況下,為方法調(diào)用添加額外的功能
    2025-02-02
  • java使用des加密解密示例分享

    java使用des加密解密示例分享

    java使用des加密解密示例,適合java語言的所有平臺,與.net等平臺的加密解密兼容
    2014-02-02
  • 詳解Spring Boot實現(xiàn)日志記錄 SLF4J

    詳解Spring Boot實現(xiàn)日志記錄 SLF4J

    本篇文章主要介紹了詳解Spring Boot實現(xiàn)日志記錄 SLF4J,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Java集合中的LinkedHashSet源碼解讀

    Java集合中的LinkedHashSet源碼解讀

    這篇文章主要介紹了Java集合中的LinkedHashSet源碼解讀,在LinkedHashMap中,雙向鏈表的遍歷順序通過構(gòu)造方法指定,如果沒有指定,則使用默認順序為插入順序,即accessOrder=false,需要的朋友可以參考下
    2023-12-12
  • Java Arrays.sort()如何實現(xiàn)對int類型數(shù)組倒序排序

    Java Arrays.sort()如何實現(xiàn)對int類型數(shù)組倒序排序

    這篇文章主要介紹了Java Arrays.sort()如何實現(xiàn)對int類型數(shù)組倒序排序問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • SpringBoot部署和前端連接問題解決的完整指南(net::ERR_CONNECTION_REFUSED)

    SpringBoot部署和前端連接問題解決的完整指南(net::ERR_CONNECTION_REFUSED)

    在開發(fā)和部署 Spring Boot 應(yīng)用時,可能會遇到各種問題,例如 JAR 文件無法運行、前端無法連接后端服務(wù)等,本文將詳細總結(jié)這些問題的解決方法,幫助你順利部署和運行 Spring Boot 應(yīng)用,需要的朋友可以參考下
    2025-01-01
  • 詳解Java TCC分布式事務(wù)實現(xiàn)原理

    詳解Java TCC分布式事務(wù)實現(xiàn)原理

    這篇文章主要介紹了詳解Java TCC分布式事務(wù)實現(xiàn)原理,對分布式事務(wù)感興趣的同學(xué),一定要看一下
    2021-04-04

最新評論

桐梓县| 福清市| 保靖县| 普兰店市| 静宁县| 上蔡县| 壤塘县| 比如县| 宁波市| 定陶县| 无为县| 乌拉特后旗| 桂阳县| 武冈市| 农安县| 乌兰县| 富源县| 兴宁市| 普陀区| 炉霍县| 怀远县| 闵行区| 甘肃省| 方城县| 竹北市| 衡南县| 志丹县| 天柱县| 达日县| 青冈县| 腾冲县| 乌审旗| 宝兴县| 巩留县| 岳西县| 章丘市| 南丹县| 堆龙德庆县| 瑞金市| 江北区| 申扎县|