 Jackson序列化json时null转成0或空串
Jackson序列化json时null转成0或空串
  在项目中可能会遇到null,转JSON时不希望出现null,可以添加下面的配置解决这个问题。
# 全局处理
定义bean解析器
public class MyBeanSerializerModifier extends BeanSerializerModifier {
    public MyBeanSerializerModifier() {
    }
    @Override
	public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) {
        beanProperties.forEach((writer) -> {
            if (!writer.hasNullSerializer()) {
                JavaType type = writer.getType();
                Class<?> clazz = type.getRawClass();
                if (type.isTypeOrSubTypeOf(Number.class)) {
                    writer.assignNullSerializer(MyBeanSerializerModifier.NullJsonSerializers.NUMBER_JSON_SERIALIZER);
                } else if (type.isTypeOrSubTypeOf(Boolean.class)) {
                    writer.assignNullSerializer(MyBeanSerializerModifier.NullJsonSerializers.BOOLEAN_JSON_SERIALIZER);
                } else if (type.isTypeOrSubTypeOf(Character.class)) {
                    writer.assignNullSerializer(MyBeanSerializerModifier.NullJsonSerializers.STRING_JSON_SERIALIZER);
                } else if (type.isTypeOrSubTypeOf(String.class)) {
                    writer.assignNullSerializer(MyBeanSerializerModifier.NullJsonSerializers.STRING_JSON_SERIALIZER);
                } else if (!type.isArrayType() && !clazz.isArray() && !type.isTypeOrSubTypeOf(Collection.class)) {
                    if (type.isTypeOrSubTypeOf(OffsetDateTime.class)) {
                        writer.assignNullSerializer(MyBeanSerializerModifier.NullJsonSerializers.STRING_JSON_SERIALIZER);
                    } else if (!type.isTypeOrSubTypeOf(Date.class) && !type.isTypeOrSubTypeOf(TemporalAccessor.class)) {
                        writer.assignNullSerializer(MyBeanSerializerModifier.NullJsonSerializers.OBJECT_JSON_SERIALIZER);
                    } else {
                        writer.assignNullSerializer(MyBeanSerializerModifier.NullJsonSerializers.STRING_JSON_SERIALIZER);
                    }
                } else {
                    writer.assignNullSerializer(MyBeanSerializerModifier.NullJsonSerializers.ARRAY_JSON_SERIALIZER);
                }
            }
        });
        return super.changeProperties(config, beanDesc, beanProperties);
    }
    public interface NullJsonSerializers {
        JsonSerializer<Object> STRING_JSON_SERIALIZER = new JsonSerializer<Object>() {
            @Override
			public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
                gen.writeString("");
            }
        };
        JsonSerializer<Object> NUMBER_JSON_SERIALIZER = new JsonSerializer<Object>() {
            @Override
			public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
                gen.writeNumber(0);
            }
        };
        JsonSerializer<Object> BOOLEAN_JSON_SERIALIZER = new JsonSerializer<Object>() {
            @Override
			public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
                gen.writeObject(Boolean.FALSE);
            }
        };
        JsonSerializer<Object> ARRAY_JSON_SERIALIZER = new JsonSerializer<Object>() {
            @Override
			public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
                gen.writeStartArray();
                gen.writeEndArray();
            }
        };
        JsonSerializer<Object> OBJECT_JSON_SERIALIZER = new JsonSerializer<Object>() {
            @Override
			public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
                gen.writeStartObject();
                gen.writeEndObject();
            }
        };
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
配置message转换器
public class MappingApiJackson2HttpMessageConverter extends AbstractReadWriteJackson2HttpMessageConverter {
    public MappingApiJackson2HttpMessageConverter(ObjectMapper objectMapper, MyJacksonProperties properties) {
        super(objectMapper, initWriteObjectMapper(objectMapper, properties), initMediaType(properties));
    }
    private static ObjectMapper initWriteObjectMapper(ObjectMapper readObjectMapper, JacksonProperties properties) {
        ObjectMapper writeObjectMapper = readObjectMapper.copy();
  
		// 配置开关
        if (Boolean.TRUE.equals(properties.getNullToEmpty())) {
            writeObjectMapper.setSerializerFactory(writeObjectMapper.getSerializerFactory().withSerializerModifier(new BladeBeanSerializerModifier()));
            writeObjectMapper.getSerializerProvider().setNullValueSerializer(NullJsonSerializers.STRING_JSON_SERIALIZER);
        }
        return writeObjectMapper;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
配置开关:
@ConfigurationProperties("jackson")
public class JacksonProperties {
    private Boolean nullToEmpty;
}   
1
2
3
4
2
3
4
注册消息转换器:
@Configuration(
    proxyBeanMethods = false
)
@Order(-2147483648)
public class MessageConfiguration implements WebMvcConfigurer {
    private final ObjectMapper objectMapper;
    private final JacksonProperties properties;
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.removeIf((x) -> {
            return x instanceof StringHttpMessageConverter || x instanceof AbstractJackson2HttpMessageConverter;
        });
  
        converters.add(new MappingApiJackson2HttpMessageConverter(this.objectMapper, this.properties));
    }
    
     public MessageConfiguration(final ObjectMapper objectMapper, final JacksonProperties properties) {
        this.objectMapper = objectMapper;
        this.properties = properties;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 局部处理
定义空系列化处理器:
public class NumberNullSerialeze extends JsonSerializer<Object> {
   public static final int DEFULT_VALUE = 0;
   @Override
   public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
      gen.writeNumber(DEFULT_VALUE);
   }
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
在字段上添加注解:
@JsonSerialize(nullsUsing = NumberNullSerialeze.class)
private Long availableAmt;
1
2
2
上次更新: 2024/01/30, 15:08:57
- 01
- 保姆级教程 用DeepSeek+飞书,批量写文案、写文章,太高效了06-06
- 03
- 熬夜做PPT?AI一键生成高逼格幻灯片,效率提升10倍!06-06
