欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2024年03月06日 10:28:50   作者:小萬是個(gè)程序員  
在平時(shí)的業(yè)務(wù)開發(fā)中,經(jīng)常會(huì)有拿到一串序列化后的字符串要來反序列化,下面這篇文章主要給大家介紹了如何解決一個(gè)JSON反序列化問題的相關(guān)資料,空字符串變?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)文章

  • 解決springmvc關(guān)于前臺(tái)日期作為實(shí)體類對(duì)象參數(shù)類型轉(zhuǎn)換錯(cuò)誤的問題

    解決springmvc關(guān)于前臺(tái)日期作為實(shí)體類對(duì)象參數(shù)類型轉(zhuǎn)換錯(cuò)誤的問題

    下面小編就為大家?guī)硪黄鉀Qspringmvc關(guān)于前臺(tái)日期作為實(shí)體類對(duì)象參數(shù)類型轉(zhuǎn)換錯(cuò)誤的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java編寫猜數(shù)字小游戲

    Java編寫猜數(shù)字小游戲

    這篇文章主要為大家詳細(xì)介紹了Java編寫的猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-09-09
  • async-excel實(shí)現(xiàn)多sheet異步導(dǎo)出方法詳解

    async-excel實(shí)現(xiàn)多sheet異步導(dǎo)出方法詳解

    這篇文章主要介紹了async-excel實(shí)現(xiàn)多sheet異步導(dǎo)出方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-12-12
  • 徹底理解Java中的ThreadLocal

    徹底理解Java中的ThreadLocal

     ThreadLocal翻譯成中文比較準(zhǔn)確的叫法應(yīng)該是:線程局部變量。使用這個(gè)工具類可以很簡(jiǎn)潔地編寫出優(yōu)美的多線程程序。 接下來通過本文給大家介紹Java中的ThreadLocal,需要的朋友可以參考下
    2017-03-03
  • mybatis-plus開啟sql日志打印的三種方法

    mybatis-plus開啟sql日志打印的三種方法

    本文主要介紹了mybatis-plus開啟sql日志打印的三種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • IDEA下lombok安裝及找不到get,set的問題的解決方法

    IDEA下lombok安裝及找不到get,set的問題的解決方法

    這篇文章主要介紹了IDEA下lombok安裝及找不到get,set的問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Java多線程深入理解

    Java多線程深入理解

    這篇文章主要介紹了java多線程編程實(shí)例,分享了幾則多線程的實(shí)例代碼,具有一定參考價(jià)值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下
    2021-07-07
  • Installij IDEA install或clean項(xiàng)目的使用

    Installij IDEA install或clean項(xiàng)目的使用

    這篇文章主要介紹了Installij IDEA install或clean項(xiàng)目的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Spring IOC源碼剖析_如何整體認(rèn)知Spring體系結(jié)構(gòu)

    Spring IOC源碼剖析_如何整體認(rèn)知Spring體系結(jié)構(gòu)

    這篇文章主要介紹了Spring IOC源碼剖析_如何整體認(rèn)知Spring體系結(jié)構(gòu)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • RestTemplate集成Ribbbon的示例代碼

    RestTemplate集成Ribbbon的示例代碼

    這篇文章主要介紹了RestTemplate集成Ribbbon的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08

最新評(píng)論