# default-v-demo
**Repository Path**: TopSkyhua/default-v-demo
## Basic Information
- **Project Name**: default-v-demo
- **Description**: No description available
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2021-08-15
- **Last Updated**: 2025-04-23
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
@[TOC](Jackson 自定义注解实现null值自定义序列化)
# Jackson 自定义注解实现null值自定义序列化
spring项目中都使用的是Jackson为默认的序列化方式,但是不免有时不满足项目的需要,例如以下场景:
1. 返回前端时部分字段不能为null,需要默认值
2. 某类型的字段需要默认值
3. 某字段需要特殊默认值
综上各类场景,总而言之就是要对为 `null` 值的字段进行一些默认值赋值处理,让返回的json中不存在未null的字段,针对此需求无非两种解决方式:一是在业务中手动编码进行各字段赋值(当然部分也需要这么做),二是进行序列化方式配置,让系统在序列化时自动进行赋值
第一种方式的弊端我想大家都能一目了然(重复、烦杂),今天我们主讲第二种实现方式
## 目前简单的方式
1. 直接使用fastjson,配置简单,内置配置即可实现
2. 使用Jackson,使用本次介绍的方式
对比:
使用fastjson的方式配置比较简单,使用也方便,能满足需求,但是本身不够灵活,因为是配置全局生效,要排除的字段需要单独指定序列化方式
使用本次介绍的方式灵活度很高,默认为原本的序列化方式(null 序列化还是 null),不做任何处理,而针对极少场景再使用`自定义注解`改变默认序列化方式,让null值序列化为默认值
## 原理
开发自定义的null值序列化方式,然后配置全局Jackson null值序列化方式进行使用。
其中:
`自定义注解`:
主要标识某个类、某个字段需要不为null,需要使用自定义序列化方式,然后再根据注解配置进行自定义的序列化
`null值自定义序列化器`:
拦截所有值为null的字段进入自定义序列化器,然后根据`自定义注解`配置进行不同的序列化写值
## 部分实现
1. 自定义注解 `@NeedNotNull`
```java
package com.lth.json.jackson;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
*
* json 字段需要不为null
* 只有字段为null时的序列化才会使用此方式,有值的和正常一样
*
*
* @author Tophua
* @since 2021/8/13
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.FIELD})
public @interface NeedNotNull {
/**
* 是否排除,只针对字段
*
* @return true:按原默认处理,false:按此注解处理
*/
boolean isExclude() default false;
/**
* 自定义值,有此值时已此值为主
*
* @return customV
*/
String customV() default "";
/**
* 是否处理Boolean值
*
* @return true:Boolean字段为null时序列化为 boolV 值,false:不处理Boolean字段 null -> null
*/
boolean boolT() default true;
/**
* boolean 默认值
*
* @return boolV
*/
boolean boolV() default false;
/**
* 是否处理Number值
*
* @return true:Number字段为null时序列化为 numberV 值,false:不处理Number字段 null -> null
*/
boolean numberT() default true;
/**
* Number 默认值
*
* @return numberV
*/
int numberV() default 0;
/**
* 是否处理String值
*
* @return true:String字段为null时序列化为 stringV 值,false:不处理String字段 null -> null
*/
boolean stringT() default true;
/**
* String 默认值
*
* @return stringV
*/
String stringV() default "";
/**
* 是否处理Coll(集合和数组)值,null -> 空集合
*
* @return true:Coll字段为null时序列化为 '[]' 值,false:不处理Coll字段 null -> null
*/
boolean collT() default true;
}
```
2. `自定义null值序列化器`
```java
package com.lth.json.jackson;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import java.io.IOException;
/**
*
* json 字段为null时的自定义序列化方式
* 只有字段为null时的序列化才会使用此方式,有值的和正常一样
*
*
* @author Tophua
* @since 2021/8/13
*/
@NoArgsConstructor
@AllArgsConstructor
public class NeedNotNullSerialize extends JsonSerializer