国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot序列化、反序列化空字符串為null的三種方式

這篇具有很好參考價值的文章主要介紹了SpringBoot序列化、反序列化空字符串為null的三種方式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、需求:接收前端傳入的""空字符串參數(shù),有時候我們需要把它轉(zhuǎn)為null

  • SpringBoot項目
  • 方式:①Jackson(推薦)、②切面+反射、③注解+切面+反射
  • 后兩種方式,未做返回值的處理。

二、三種方式

1、Jackson正反序列化(推薦)

  • StdConverter 和 JsonSerializer的區(qū)別
兩種方式都可以實現(xiàn)將空字符串修改為 null 值的邏輯,但它們之間有一些區(qū)別:

1. **繼承的類不同**:
   - 使用 `StdConverter` 方式時,`StringToNullSerializer` 類繼承自 `StdConverter<String, String>`,并實現(xiàn)了 `convert` 方法。
   - 使用 `JsonSerializer` 方式時,`StringToNullSerializer` 類直接繼承自 `JsonSerializer<String>`,并實現(xiàn)了 `serialize` 方法。

2. **接口和方法不同**:
   - `StdConverter` 是 Jackson 庫中提供的用于定義轉(zhuǎn)換器的類,其中的 `convert` 方法用于將一個類型轉(zhuǎn)換為另一個類型。
   - `JsonSerializer` 是 Jackson 庫中用于定制序列化邏輯的接口,其中的 `serialize` 方法用于將 Java 對象序列化為 JSON 數(shù)據(jù)。

3. **對于序列化過程的處理不同**:
   - 在 `StdConverter` 方式中,你需要實現(xiàn) `convert` 方法來定義如何將空字符串轉(zhuǎn)換為 null 值。
   - 在 `JsonSerializer` 方式中,你需要實現(xiàn) `serialize` 方法來定義如何將字段序列化為 JSON 數(shù)據(jù),并在其中進行空字符串轉(zhuǎn)換為 null 值的處理。

綜上所述,兩種方式都可以實現(xiàn)相同的功能,選擇哪一種方式取決于個人偏好以及代碼的整體結(jié)構(gòu)和風格。通常來說,如果只需要定制序列化邏輯而不需要轉(zhuǎn)換其他類型,直接實現(xiàn) `JsonSerializer` 接口可能會更清晰和簡潔。
  • ENTITY
package com.cc.jxtd.entity;

import com.cc.jxtd.serializer.ConverterEmptyStringToNull;
import com.cc.jxtd.serializer.EmptyStringToNullDeserializer;
import com.cc.jxtd.serializer.ConverterEmptyStringToInteger0;
import com.cc.jxtd.serializer.EmptyStringToNullSerializer;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Data;

import javax.naming.Name;

/**
 * <p>請求,返回都用這個</p>
 *
 * @author --
 * @since 2024/4/19
 */
@Data
public class UserCs {

    private Long id;

    //反序列化(前端請求):空字符串為null
    @JsonDeserialize(using = EmptyStringToNullDeserializer.class)
    private String name;

    //反序列化(前端請求):轉(zhuǎn)換:為其他類型的值(轉(zhuǎn)換為int的0)
    @JsonDeserialize(converter = ConverterEmptyStringToInteger0.class)
    private Integer descConverter0;

    //序列化(后端返回):空字符串為null
    @JsonSerialize(using = EmptyStringToNullSerializer.class)
    private String descSerialize;

    //序列化(后端返回):轉(zhuǎn)換:空字符串轉(zhuǎn)為null
    @JsonSerialize(converter = ConverterEmptyStringToNull.class)
    private String descConverterNull;
    
}

  • 序列化處理類
package com.cc.jxtd.serializer;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;

/** 序列化:String的空轉(zhuǎn)為null
 * @author --
 * @since 2024/4/18
 **/
public class EmptyStringToNullSerializer extends JsonSerializer<String> {

    /**
     * 序列化為null
     */
    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException {
        if (value == null || value.trim().isEmpty()) {
            gen.writeNull();
        }else {
            gen.writeString(value);
        }
    }
}
  • 反序列化處理類
package com.cc.jxtd.serializer;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import java.io.IOException;

/** 反序列化:空字符串轉(zhuǎn)換為null
 * @author --
 * @since 2024/4/18
 **/
public class EmptyStringToNullDeserializer extends JsonDeserializer<String> {

    /**
     * 反序列化為null
     */
    @Override
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String value = p.getValueAsString();
        if (value == null || value.trim().isEmpty()) {
            return null;
        }
        return value;
    }

}
  • 序列化-轉(zhuǎn)換1
package com.cc.jxtd.serializer;

import com.fasterxml.jackson.databind.util.StdConverter;

/** 序列化-轉(zhuǎn)換:將string的空轉(zhuǎn)為null
 * @author --
 * @since 2024/4/18
 **/
public class ConverterEmptyStringToNull extends StdConverter<String, String> {

    @Override
    public String convert(String value) {
        //把空的string轉(zhuǎn)為int的0
        if (value == null || value.trim().isEmpty()) {
            return null;
        }
        return value;
    }

}
  • 序列化-轉(zhuǎn)換2
package com.cc.jxtd.serializer;

import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.databind.util.StdConverter;

/** 序列化:1將string轉(zhuǎn)為int。
 *         2轉(zhuǎn)換String的空或null -》 轉(zhuǎn)為Integer的0
 * @author --
 * @since 2024/4/18
 **/
public class ConverterEmptyStringToInteger0 extends StdConverter<String, Integer> {

    @Override
    public Integer convert(String value) {
        //把空的string轉(zhuǎn)為int的0
        if (value == null || value.trim().isEmpty()) {
            return 0;
        }
        return Integer.valueOf(value);
    }

}
  • Controller
package com.cc.jxtd.web.controller;

import com.cc.jxtd.entity.UserCs;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * <p></p>
 *
 * @author --
 * @since 2024/4/19
 */
@RestController
@RequestMapping("/userCs")
public class UserController {

    @PostMapping
    public UserCs get(@RequestBody UserCs req){
        System.out.println("請求參數(shù)-id:"   + req.getId());
        System.out.println("請求參數(shù)-name:" + req.getName());
        System.out.println("請求參數(shù)-desc1:" + req.getDescSerialize());
        System.out.println("請求參數(shù)-desc2:" + req.getDescConverterNull());
        System.out.println("請求參數(shù)-desc3:" + req.getDescConverter0());

        //返回:序列化
        return req;
    }
}
  • 測試
    SpringBoot序列化、反序列化空字符串為null的三種方式

2、切面+反射/3、注解+切面+反射

  • 區(qū)別
2、切面+反射:所有空字符串的字段都轉(zhuǎn)為null
3、注解+切面+反射:只有打了@EmptyToNull的字段才會轉(zhuǎn)換
  • 導(dǎo)入包
		<!--spring-boot-starter-aop-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
  • 切面
package com.cc.jxtd.aspect;

import com.cc.jxtd.annotation.EmptyToNull;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.util.Objects;

/** 切面
 * @author --
 */
@Aspect
@Component
public class UpdateAspect {

    private static final Logger logger = LoggerFactory.getLogger(UpdateAspect.class);

    //切入點
    @Pointcut("@annotation(com.cc.jxtd.annotation.OptConverter)")
    public void validPointCut() {
    }

    /**
     * 環(huán)繞修改參數(shù)
     */
    @Around("validPointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        Object[] args = point.getArgs();
        Object arg = args[0];
        //2、切面+反射:全部轉(zhuǎn)換
        this.allEmptyToNull(arg);
        //3、注解+切面+反射:部分轉(zhuǎn)換
//        this.assignEmptyToNull(arg);

        return point.proceed();
    }

    /**
     * 設(shè)置請求參數(shù)中 所有字段的空值(如:String的空字符串)為null
     * @param arg arg
     */
    public void allEmptyToNull(Object arg) {
        if (Objects.isNull(arg)) {
            return;
        }
        Field[] fields = arg.getClass().getDeclaredFields();
        for (Field field : fields) {
            // 設(shè)置字段可訪問
            field.setAccessible(true);
            // 如果字段是 String 類型且值為空字符串,則設(shè)置為 null
            if (field.getType() == String.class) {
                try {
                    String value = (String) field.get(arg);
                    if (value != null && value.isEmpty()) {
                        field.set(arg, null);
                    }
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
            // 可以擴展其他類型的參數(shù)……

        }
    }

    /** 指定空轉(zhuǎn)null
     * @param arg arg
     * @since 2024/4/18
     **/
    private void assignEmptyToNull(Object arg) {
        if (Objects.isNull(arg)) {
            return;
        }
        Field[] fields = arg.getClass().getDeclaredFields();
        for (Field field : fields) {
            if (field.isAnnotationPresent(EmptyToNull.class)) {
                // 設(shè)置字段可訪問
                field.setAccessible(true);
                // 如果字段是 String 類型且值為空字符串,則設(shè)置為 null
                if (field.getType() == String.class) {
                    try {
                        String value = (String) field.get(arg);
                        if (value != null && value.isEmpty()) {
                            field.set(arg, null);
                        }
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
                // 可以擴展其他類型的參數(shù)……

            }

        }
    }
}
  • 注解
package com.cc.jxtd.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 轉(zhuǎn)換
 * @author --
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OptConverter {
    
}
  • 注解2
package com.cc.jxtd.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/** 轉(zhuǎn)化空為null
 * @author --
 * @since 2024/4/18
 **/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EmptyToNull {

}
  • entity
package com.cc.jxtd.entity;

import com.cc.jxtd.serializer.ConverterEmptyStringToInteger0;
import com.cc.jxtd.serializer.ConverterEmptyStringToNull;
import com.cc.jxtd.serializer.EmptyStringToNullDeserializer;
import com.cc.jxtd.serializer.EmptyStringToNullSerializer;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Data;

/**
 * <p>請求,返回都用這個</p>
 *
 * @author --
 * @since 2024/4/19
 */
@Data
public class UserCs2 {

    private Long id;

    private String name;

    private String desc;

}
  • controller
package com.cc.jxtd.web.controller;

import com.cc.jxtd.annotation.OptConverter;
import com.cc.jxtd.entity.UserCs;
import com.cc.jxtd.entity.UserCs2;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * <p></p>
 *
 * @author --
 * @since 2024/4/19
 */
@RestController
@RequestMapping("/userCs")
public class UserController {

//    @PostMapping
//    public UserCs get(@RequestBody UserCs req){
//        System.out.println("請求參數(shù)-id:"   + req.getId());
//        System.out.println("請求參數(shù)-name:" + req.getName());
//        System.out.println("請求參數(shù)-DescSerialize:" + req.getDescSerialize());
//        System.out.println("請求參數(shù)-DescConverterNull:" + req.getDescConverterNull());
//        System.out.println("請求參數(shù)-DescConverter0:" + req.getDescConverter0());
//
//        //返回:序列化
//        return req;
//    }

    @OptConverter
    @PostMapping
    public UserCs2 get(@RequestBody UserCs2 req){
        System.out.println("請求參數(shù)-id:"   + req.getId());
        System.out.println("請求參數(shù)-name:" + req.getName());
        System.out.println("請求參數(shù)-desc:" + req.getDesc());

        //返回:序列化
        return req;
    }

}
  • 測試2
    SpringBoot序列化、反序列化空字符串為null的三種方式

  • 測試3
    SpringBoot序列化、反序列化空字符串為null的三種方式
    SpringBoot序列化、反序列化空字符串為null的三種方式
    SpringBoot序列化、反序列化空字符串為null的三種方式文章來源地址http://www.zghlxwxcb.cn/news/detail-855046.html

到了這里,關(guān)于SpringBoot序列化、反序列化空字符串為null的三種方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 用js實現(xiàn)去除字符串首尾的空字符方法

    用js實現(xiàn)去除字符串首尾的空字符方法

    trim():去除字符串前后空格 結(jié)果顯示: 正則表達式:(^s*)首部 、(s*$)尾部,用replace替換的方法將首部空字符串和尾部空字符串替換成 結(jié)果顯示: split將字符串轉(zhuǎn)變?yōu)閿?shù)組,過濾條件filter()方法不等于\\\"\\\",用jion()將數(shù)組轉(zhuǎn)化為字符串。 filter()方法會創(chuàng)建一個新數(shù)組,原數(shù)組的每

    2024年02月14日
    瀏覽(31)
  • vue 對后端返回字段值為null的變成空字符串

    // 字段null轉(zhuǎn)字符串 1.export function null2str(data) { ? ? for (let x in data) { ? ? ? ? if (data[x] === null) { ? ? ? ? ? ? // 如果是null 把直接內(nèi)容轉(zhuǎn)為 \\\'\\\' ? ? ? ? ? ? data[x] = \\\"\\\"; ? ? ? ? } else { ? ? ? ? ? ? if (Array.isArray(data[x])) { ? ? ? ? ? ? ? ? // 是數(shù)組遍歷數(shù)組 遞歸繼續(xù)處理 ? ? ?

    2024年02月11日
    瀏覽(28)
  • MySQL判斷列的值既不為NULL又不為空字符串

    在MySQL中,可以使用IS NULL和IS NOT NULL操作符來判斷一個字符串是否為NULL,可以使用’\\\'(空字符串)或NULL與字符串進行比較來判斷一個字符串是否為空。 例如,假設(shè)我們有一個名為mytable的表,其中有一個名為mycolumn的列,我們可以使用以下查詢來查找mycolumn列中不為空的值:

    2024年02月11日
    瀏覽(31)
  • java基礎(chǔ)08-Java中的null和空字符串的區(qū)別是什么?

    null表示一個變量沒有引用任何對象,而空字符串表示一個字符串變量引用了一個長度為0的字符串。 null:表示 一個變量沒有引用任何對象 。也就是說,這個變量還 沒有被分配內(nèi)存 。如: 如上,str是一個String類型的變量,但目前它沒有被引用任何對象,所以它的值為null。

    2024年01月22日
    瀏覽(25)
  • 反序列化字符串逃逸(下篇)

    反序列化字符串逃逸(下篇)

    這里承接上篇文章反序列化字符串逃逸(上篇)-CSDN博客帶大家學(xué)習反序列化字符串逃逸減少,沒有看過的可以先去看看,不會吃虧。 例題: ?php highlight_file(__FILE__); error_reporting(0); function?filter($name){ ????$safe=array(\\\"flag\\\",\\\"php\\\"); ????$name=str_replace($safe,\\\"hk\\\",$name); ????return?$

    2024年01月22日
    瀏覽(25)
  • springboot對象序列化自定義序列化注解

    在開發(fā)中有時候會遇到一些內(nèi)容返回時需要翻譯,或者一些內(nèi)容在序列化之前需要特殊處理(脫敏啥的)。 一般對單個屬性可以直接用 jackson 的序列化注解對某個屬性單獨處理 com.fasterxml.jackson.databind.annotation.JsonSerialize(using= xxx.class) 但是直接使用不太靈活,可以進一步引入注

    2024年02月07日
    瀏覽(26)
  • Springboot Jackson 序列化與反序列化配置

    可解決在使用默認反序列化Jackson時,LocalDateTime類型的請求參數(shù)反序列化失敗的問題

    2024年02月02日
    瀏覽(26)
  • PHP反序列化漏洞-字符串逃逸

    字符串逃逸(閉合) 字符串逃逸(閉合)是一種在反序列化函數(shù)可控的情況下,通過修改序列化字符串中的敏感字符來達到字符串逃逸的方法。 具體而言,可以通過修改變量名等個數(shù),使得序列化字符串中的字符個數(shù)與實際變量值個數(shù)不一致 。由于反序列化機制要求字符串

    2024年01月20日
    瀏覽(23)
  • Json-序列化字符串時間格式問題

    最近C#中需要將實體進行json序列化,使用了Newtonsoft.Json 序列化出來的Json字符串有兩個問題 1.沒有進行格式化,對使用人員不友好; 2.時間字段形式為數(shù)字形式; ?? 查了一下網(wǎng)上對于時間字段建議先轉(zhuǎn)換成字符串,再json序列化,但是發(fā)現(xiàn)可以通過自定義時間格式進行json序

    2024年02月19日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包