springboot項(xiàng)目中jackson-序列化-處理 NULL教程
在項(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字段的過濾
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字段過濾的配置,但有的實(shí)體對(duì)象需要序列化出NULL的字段值,如何處理?
答:
1. 直接在對(duì)象上增加 @JsonInclude(JsonInclude.Include.ALWAYS) 類上的注解優(yōu)先級(jí)比較高,會(huì)覆蓋全局的配置
2.用自定義的類序列化注解(同上)
二直接在字段上加自定義序列化類會(huì)覆蓋全局配置嗎?
答:不會(huì),有默認(rèn)的 public class NullSerializer extends StdSerializer<Object> 來處理,當(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對(duì)象的序列化與反序列化的應(yīng)用
本篇文章是對(duì)Java中對(duì)象的序列化與反序列化進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
Spring中ResponseBodyAdvice的使用詳解
這篇文章主要介紹了Spring中ResponseBodyAdvice的使用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10
如何在SpringBoot項(xiàng)目中使用Oracle11g數(shù)據(jù)庫(kù)
這篇文章主要介紹了在SpringBoot項(xiàng)目中使用Oracle11g數(shù)據(jù)庫(kù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Mac安裝多個(gè)JDK并實(shí)現(xiàn)動(dòng)態(tài)切換
有時(shí)候我們有多個(gè)項(xiàng)目需要使用多個(gè)版本JDK,本文主要介紹了Mac安裝多個(gè)JDK并實(shí)現(xiàn)動(dòng)態(tài)切換,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Java中l(wèi)ombok的@Builder注解的解析與簡(jiǎn)單使用詳解
這篇文章主要介紹了Java中l(wèi)ombok的@Builder注解的解析與簡(jiǎn)單使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01

