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