springboot專案中jackson-序列化-處理 NULL
在專案中有事需要對值為NULL的物件中Field不做序列化輸入配置方式如下:
[配置型別]:
原始碼包中的列舉類:
public static enum Include {
ALWAYS,
NON_NULL,
NON_ABSENT,
NON_EMPTY,
NON_DEFAULT,
USE_DEFAULTS;
private Include() {
}
}
Include.Include.ALWAYS 預設
Include.NON_DEFAULT 屬性為預設值不序列化
Include.NON_EMPTY 屬性為 空(“”) 或者為 NULL 都不序列化
Include.NON_NULL 屬性為NULL 不序列化
方式一:全域性配置,處理所有整個應用的實體物件
#對日期型別的轉換配置
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
# 配置 引數如下 always non_absent non_default non_empty non_null use_defaults
spring.jackson.default-property-inclusion=non_null
方式二:在需要序列的話的實體類上加註解 ->[配置型別]所列
@JsonInclude(Include.NON_NULL)
方式三:配置型別
3.1自定義序列化實現類,可以作用在類上 自定義json序列化需要實現StdSerializer<T>或者JsonSerializer<T>
@JsonSerialize(using = ClientObjectSerialize.class)
public class CreditBorrowerRepaymentRequestDto{
}
實現類:對欄位型別轉換,以及對值為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自定義序列化實現類,可以作用在實體物件欄位上,對NULL值的處理,或者轉換
@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));
}
}
實踐總結:
一當全域性配置了NULL欄位過濾的配置,但有的實體物件需要序列化出NULL的欄位值,如何處理?
答: 1. 直接在物件上增加 @JsonInclude(JsonInclude.Include.ALWAYS) 類上的註解優先順序比較高,會覆蓋全域性的配置
2.用自定義的類序列化註解(同上)
二直接在欄位上加自定義序列化類會覆蓋全域性配置嗎?
答:不會,有預設的 public class NullSerializer extends StdSerializer<Object> 來處理,當值不為Null的時候才會執行自定義欄位上的序列化註解實現類