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

springboot項(xiàng)目中jackson-序列化-處理 NULL教程

 更新時(shí)間:2020年10月09日 09:30:34   作者:Turbo-HL  
這篇文章主要介紹了springboot項(xiàng)目中jackson-序列化-處理 NULL教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

在項(xiàng)目中有事需要對(duì)值為NULL的對(duì)象中Field不做序列化輸入配置方式如下:

[配置類型]:

源碼包中的枚舉類:

public static enum Include {
 ALWAYS,
 NON_NULL,
 NON_ABSENT,
 NON_EMPTY,
 NON_DEFAULT,
 USE_DEFAULTS;
 
 private Include() {
 }
}

Include.Include.ALWAYS 默認(rèn)

Include.NON_DEFAULT 屬性為默認(rèn)值不序列化

Include.NON_EMPTY 屬性為 空(“”) 或者為 NULL 都不序列化

Include.NON_NULL 屬性為NULL 不序列化

方式一:全局配置,處理所有整個(gè)應(yīng)用的實(shí)體對(duì)象

#對(duì)日期類型的轉(zhuǎn)換配置
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss 

# 配置 參數(shù)如下 always non_absent non_default non_empty non_null use_defaults

spring.jackson.default-property-inclusion=non_null 

方式二:在需要序列的話的實(shí)體類上加注解 ->[配置類型]所列

@JsonInclude(Include.NON_NULL)

方式三:配置類型

3.1自定義序列化實(shí)現(xiàn)類,可以作用在類上 自定義json序列化需要實(shí)現(xiàn)StdSerializer<T>或者JsonSerializer<T>

@JsonSerialize(using = ClientObjectSerialize.class)
public class CreditBorrowerRepaymentRequestDto{
}

實(shí)現(xiàn)類:對(duì)字段類型轉(zhuǎn)換,以及對(duì)值為null字段的過(guò)濾

public class ClientObjectSerialize extends JsonSerializer<CreditBorrowerRepaymentRequestDto>{
 
 @Override
 public void serialize(CreditBorrowerRepaymentRequestDto dto, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
 
  jsonGenerator.writeStartObject();
  try {
   Field[] fields = dto.getClass().getDeclaredFields();
   for (Field field : fields) {
    field.setAccessible(true);
    if(null == field.get(dto)){
     continue; 
    }
    jsonGenerator.writeFieldName(field.getName());
    jsonGenerator.writeObject(field.get(dto));
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  jsonGenerator.writeEndObject();
 }
}

3.2自定義序列化實(shí)現(xiàn)類,可以作用在實(shí)體對(duì)象字段上,對(duì)NULL值的處理,或者轉(zhuǎn)換

@JsonSerialize(using = ClientStringSerialize.class)
private String name;
 
@JsonSerialize(using = ClientDtaeSerialize.class)
private Date date;
public class ClientStringSerialize extends JsonSerializer<String> {
 
 @Override
 public void serialize(String string, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
 
  if(string == null){
   jsonGenerator.writeString(string + "[NULL]");
  }else{
   jsonGenerator.writeString(string);
  }
 }
}
public class ClientDtaeSerialize extends JsonSerializer<Date> {
 @Override
 public void serialize(Date createDate, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
  jsonGenerator.writeString(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(createDate));
 }
}

實(shí)踐總結(jié):

一當(dāng)全局配置了NULL字段過(guò)濾的配置,但有的實(shí)體對(duì)象需要序列化出NULL的字段值,如何處理?

答:

1. 直接在對(duì)象上增加 @JsonInclude(JsonInclude.Include.ALWAYS) 類上的注解優(yōu)先級(jí)比較高,會(huì)覆蓋全局的配置

2.用自定義的類序列化注解(同上)

二直接在字段上加自定義序列化類會(huì)覆蓋全局配置嗎?

答:不會(huì),有默認(rèn)的 public class NullSerializer extends StdSerializer<Object> 來(lái)處理,當(dāng)值不為Null的時(shí)候才會(huì)執(zhí)行自定義字段上的序列化注解實(shí)現(xiàn)類

補(bǔ)充知識(shí):SpringBoot中Jackson返回null處理,字符串類型轉(zhuǎn)空串,數(shù)組集合轉(zhuǎn)[],對(duì)象轉(zhuǎn){}

SpringBoot返回Json數(shù)據(jù)中null值處理,將字符串類型null值轉(zhuǎn)換為"",將集合數(shù)組類型null值轉(zhuǎn)換為[],將原始數(shù)據(jù)類型null值轉(zhuǎn)換為0,將布爾類型null值轉(zhuǎn)換為false,將實(shí)體對(duì)象null值轉(zhuǎn)換為{}。

1.自定義null值序列化處理器

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;

/**
 * 自定義null值序列化處理器
 */
public class CustomizeNullJsonSerializer {

 /**
  * 處理數(shù)組集合類型的null值
  */
 public static class NullArrayJsonSerializer extends JsonSerializer<Object> {
  @Override
  public void serialize(Object value, JsonGenerator jsonGenerator, 
    SerializerProvider serializerProvider) throws IOException {
   jsonGenerator.writeStartArray();
   jsonGenerator.writeEndArray();
  }
 }

 /**
  * 處理字符串類型的null值
  */
 public static class NullStringJsonSerializer extends JsonSerializer<Object> {
  @Override
  public void serialize(Object value, JsonGenerator jsonGenerator, 
    SerializerProvider serializerProvider) throws IOException {
   jsonGenerator.writeString("");
  }
 }

 /**
  * 處理數(shù)值類型的null值
  */
 public static class NullNumberJsonSerializer extends JsonSerializer<Object> {
  @Override
  public void serialize(Object value, JsonGenerator jsonGenerator, 
        SerializerProvider serializerProvider) throws IOException {
   jsonGenerator.writeNumber(0);
  }
 }

 /**
  * 處理boolean類型的null值
  */
 public static class NullBooleanJsonSerializer extends JsonSerializer<Object> {
  @Override
  public void serialize(Object value, JsonGenerator jsonGenerator, 
        SerializerProvider serializerProvider) throws IOException {
   jsonGenerator.writeBoolean(false);
  }
 }

 /**
  * 處理實(shí)體對(duì)象類型的null值
  */
 public static class NullObjectJsonSerializer extends JsonSerializer<Object> {
  @Override
  public void serialize(Object value, JsonGenerator jsonGenerator, 
        SerializerProvider serializerProvider) throws IOException {
   jsonGenerator.writeStartObject();
   jsonGenerator.writeEndObject();
  }
 }
}

2.序列化程序修改器

import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.SerializationConfig;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;

import java.util.Collection;
import java.util.List;

/**
 * <pre>
 * 此modifier主要做的事情為:
 * 1.當(dāng)序列化類型為數(shù)組集合時(shí),當(dāng)值為null時(shí),序列化成[]
 * 2.String類型值序列化為""
 *
 * </pre>
 */
public class MyBeanSerializerModifier extends BeanSerializerModifier {

 @Override
 public List<BeanPropertyWriter> changeProperties(SerializationConfig config, 
              BeanDescription beanDesc,
              List<BeanPropertyWriter> beanProperties) {
  // 循環(huán)所有的beanPropertyWriter
  for (int i = 0; i < beanProperties.size(); i++) {
   BeanPropertyWriter writer = beanProperties.get(i);
   // 判斷字段的類型,如果是數(shù)組或集合則注冊(cè)nullSerializer
   if (isArrayType(writer)) {
    // 給writer注冊(cè)一個(gè)自己的nullSerializer 
    writer.assignNullSerializer(new CustomizeNullJsonSerializer.NullArrayJsonSerializer());
   }
   if (isStringType(writer)) {
    writer.assignNullSerializer(new CustomizeNullJsonSerializer.NullStringJsonSerializer());
   }
  }
  return beanProperties;
 }

 /**
  * 是否是數(shù)組
  */
 private boolean isArrayType(BeanPropertyWriter writer) {
  Class<?> clazz = writer.getType().getRawClass();
  return clazz.isArray() || Collection.class.isAssignableFrom(clazz);
 }

 /**
  * 是否是String
  */
 private boolean isStringType(BeanPropertyWriter writer) {
  Class<?> clazz = writer.getType().getRawClass();
  return CharSequence.class.isAssignableFrom(clazz) || Character.class.isAssignableFrom(clazz);
 }

 /**
  * 是否是數(shù)值類型
  */
 private boolean isNumberType(BeanPropertyWriter writer) {
  Class<?> clazz = writer.getType().getRawClass();
  return Number.class.isAssignableFrom(clazz);
 }

 /**
  * 是否是boolean
  */
 private boolean isBooleanType(BeanPropertyWriter writer) {
  Class<?> clazz = writer.getType().getRawClass();
  return clazz.equals(Boolean.class);
 }
}

3.配置Jackson實(shí)體

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

/**
 * 配置Jackson實(shí)體
 */
@Configuration
public class JacksonConfig {
 @Bean
 @Primary
 @ConditionalOnMissingBean(ObjectMapper.class)
 public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
  ObjectMapper objectMapper = builder.createXmlMapper(false).build();
  /** 為objectMapper注冊(cè)一個(gè)帶有SerializerModifier的Factory */
  objectMapper.setSerializerFactory(objectMapper.getSerializerFactory()
    .withSerializerModifier(new MyBeanSerializerModifier()));

  SerializerProvider serializerProvider = objectMapper.getSerializerProvider();
  serializerProvider.setNullValueSerializer(new CustomizeNullJsonSerializer
 .NullObjectJsonSerializer());
  return objectMapper;
 }
}

以上這篇springboot項(xiàng)目中jackson-序列化-處理 NULL教程就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java為什么匿名內(nèi)部類參數(shù)引用需要用final進(jìn)行修飾?

    Java為什么匿名內(nèi)部類參數(shù)引用需要用final進(jìn)行修飾?

    今天小編就為大家分享一篇關(guān)于Java為什么匿名內(nèi)部類參數(shù)引用需要用final進(jìn)行修飾?,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04
  • Spring Boot外部化配置實(shí)戰(zhàn)解析

    Spring Boot外部化配置實(shí)戰(zhàn)解析

    這篇文章主要介紹了Spring Boot外部化配置實(shí)戰(zhàn)解析,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • Java如何通過(guò)屬性名獲取Object對(duì)象屬性值

    Java如何通過(guò)屬性名獲取Object對(duì)象屬性值

    這篇文章主要介紹了Java如何通過(guò)屬性名獲取Object對(duì)象屬性值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java異常處理Guava?Throwables類使用實(shí)例解析

    Java異常處理Guava?Throwables類使用實(shí)例解析

    這篇文章主要為大家介紹了Java異常處理神器Guava?Throwables類使用深入詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Spring用三級(jí)緩存處理循環(huán)依賴的方法詳解

    Spring用三級(jí)緩存處理循環(huán)依賴的方法詳解

    這篇文章主要介紹了Spring用三級(jí)緩存處理循環(huán)依賴的方法,在Spring?框架中,依賴注入是其核心特性之一,它允許對(duì)象之間的依賴關(guān)系在運(yùn)行時(shí)動(dòng)態(tài)注入,然而,當(dāng)多個(gè)Bean之間的依賴關(guān)系形成一個(gè)閉環(huán)時(shí),就會(huì)出現(xiàn)循環(huán)依賴問(wèn)題,本文就為解決此問(wèn)題,需要的朋友可以參考下
    2025-02-02
  • Maven項(xiàng)src/main/java目錄下配置文件無(wú)法被導(dǎo)出或者生效的問(wèn)題和處理方案

    Maven項(xiàng)src/main/java目錄下配置文件無(wú)法被導(dǎo)出或者生效的問(wèn)題和處理方案

    這篇文章主要介紹了Maven項(xiàng)src/main/java目錄下配置文件無(wú)法被導(dǎo)出或者生效的問(wèn)題和處理方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • MyBatis在mapper中傳遞參數(shù)的四種方式

    MyBatis在mapper中傳遞參數(shù)的四種方式

    MyBatis是一個(gè)持久層框架,它提供了一種將數(shù)據(jù)庫(kù)操作與Java對(duì)象之間的映射關(guān)系進(jìn)行配置的方式,在MyBatis中,Mapper是用于定義數(shù)據(jù)庫(kù)操作的接口,而參數(shù)傳遞則是通過(guò)Mapper接口的方法來(lái)實(shí)現(xiàn)的,本文給大家介紹了MyBatis在mapper中傳遞參數(shù)的四種方式,需要的朋友可以參考下
    2024-03-03
  • 將JavaWeb項(xiàng)目部署到云服務(wù)器的詳細(xì)步驟

    將JavaWeb項(xiàng)目部署到云服務(wù)器的詳細(xì)步驟

    這篇文章主要介紹了將JavaWeb項(xiàng)目部署到云服務(wù)器的詳細(xì)步驟,文章通過(guò)圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-12-12
  • Feign如何實(shí)現(xiàn)第三方的HTTP請(qǐng)求

    Feign如何實(shí)現(xiàn)第三方的HTTP請(qǐng)求

    這篇文章主要介紹了Feign如何實(shí)現(xiàn)第三方的HTTP請(qǐng)求,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • jdk在centos中安裝配置圖文教程

    jdk在centos中安裝配置圖文教程

    這篇文章主要介紹了jdk在centos中安裝配置圖文教程,文中給出大家jdk下載地址,需要的朋友可以參考下
    2018-04-04

最新評(píng)論

呼伦贝尔市| 平遥县| 斗六市| 弋阳县| 烟台市| 日照市| 鹤壁市| 元朗区| 漳平市| 保亭| 金门县| 嘉定区| 嘉义县| 九江县| 五家渠市| 怀柔区| 双辽市| 凤凰县| 贵德县| 湖口县| 樟树市| 富平县| 芮城县| 嵊泗县| 政和县| 洛宁县| 嘉荫县| 土默特右旗| 鲜城| 井陉县| 航空| 福泉市| 文昌市| 安义县| 根河市| 天气| 大新县| 韩城市| 武鸣县| 聊城市| 盘山县|