jackson:
default-property-inclusion: always # 确保 null 会走到序列化器
serialization:
write-null-map-values: true
java
package com.idsoftwhl.biz.init;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
import java.util.List;
@Configuration
public class JacksonConfig {
public JacksonConfig() {
System.out.println(">>>>>>>>>> JacksonPatch loaded <<<<<<<<<<");
}
@Bean
public ObjectMapper objectMapper() {
ObjectMapper om = new ObjectMapper();
om.setSerializationInclusion(JsonInclude.Include.ALWAYS); // 让 null 也参与序列化
// 1. 非集合 -> ""
JsonSerializer<Object> nullToEmptyString = new JsonSerializer<Object>() {
@Override
public void serialize(Object value, JsonGenerator g,
SerializerProvider provider) throws IOException {
g.writeString("");
}
};
// 2. 集合 -> []
JsonSerializer<Object> nullToEmptyArray = new JsonSerializer<Object>() {
@Override
public void serialize(Object value, JsonGenerator g,
SerializerProvider provider) throws IOException {
g.writeStartArray();
g.writeEndArray();
}
};
// 3. 注册 Modifier
om.setSerializerFactory(
om.getSerializerFactory()
.withSerializerModifier(new BeanSerializerModifier() {
@Override
public List<BeanPropertyWriter> changeProperties(SerializationConfig config,
BeanDescription beanDesc,
List<BeanPropertyWriter> writers) {
for (BeanPropertyWriter w : writers) {
if (w.getType().isCollectionLikeType() || w.getType().isArrayType()) {
w.assignNullSerializer(nullToEmptyArray);
} else {
w.assignNullSerializer(nullToEmptyString);
}
}
return writers;
}
})
);
return om;
}
}