JackSon是解析JSON和XML的一个框架,优点是简单易用,性能较高。
SpringBoot使用Jackson序列化时将null转成空字符串
简介
大家知道很多情况下,我们的API中数据交换都用JSON数据,这种数据格式简单、易读写、且轻量。在SpringBoot中默认使用jackson帮助我们进行序列化与反序列化的操作。
在控制层将我们的对象序列化返回给前端时,有些字段为null,序列化后的值也是null,如果前端直接展示的话,对用户不够友好,这里我们可以对jackson稍加修改,将值为null的转换成空字符串""。
不要使用继承MappingJackson2HttpMessageConverter的方式进行编写,可能会导致无法访问swgger文档的情况,但是接口是可以正常调用的
使用以下方式
可以根据不同类型的null转换成指定的值
package ;
import ;
import ;
import ;
import ;
/**
* 自定义null值序列化处理器
*/
public class CustomizeNullJsonSerializer {
/**
* 处理数组集合类型的null值
*/
public static class NullArrayJsonSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object value, JsonGenerator jsonGenerator,
SerializerProvider serializerProvider) throws IOException {
();
();
}
}
/**
* 处理字符串类型的null值
*/
public static class NullStringJsonSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object value, JsonGenerator jsonGenerator,
SerializerProvider serializerProvider) throws IOException {
("");
}
}
/**
* 处理数值类型的null值
*/
public static class NullNumberJsonSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object value, JsonGenerator jsonGenerator,
SerializerProvider serializerProvider) throws IOException {
(0);
}
}
/**
* 处理boolean类型的null值
*/
public static class NullBooleanJsonSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object value, JsonGenerator jsonGenerator,
SerializerProvider serializerProvider) throws IOException {
(false);
}
}
/**
* 处理实体对象类型的null值
*/
public static class NullObjectJsonSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object value, JsonGenerator jsonGenerator,
SerializerProvider serializerProvider) throws IOException {
();
();
}
}
}
package ;
import ;
import ;
import ;
import ;
import ;
import ;
/**
* <pre>
* 此modifier主要做的事情为:
* 1.当序列化类型为数组集合时,当值为null时,序列化成[]
* 类型值序列化为""
*
* </pre>
*/
public class MyBeanSerializerModifier extends BeanSerializerModifier {
@Override
public List<BeanPropertyWriter> changeProperties(SerializationConfig config,
BeanDescription beanDesc,
List<BeanPropertyWriter> beanProperties) {
// 循环所有的beanPropertyWriter
for (int i = 0; i < (); i++) {
BeanPropertyWriter writer = (i);
// 判断字段的类型,如果是数组或集合则注册nullSerializer
/*if (isArrayType(writer)) {
// 给writer注册一个自己的nullSerializer
(new ());
}*/
if (isStringType(writer)) {
(new ());
}
}
return beanProperties;
}
/**
* 是否是数组
*/
private boolean isArrayType(BeanPropertyWriter writer) {
Class<?> clazz = ().getRawClass();
return () || (clazz);
}
/**
* 是否是String
*/
private boolean isStringType(BeanPropertyWriter writer) {
Class<?> clazz = ().getRawClass();
return (clazz) || (clazz);
}
/**
* 是否是数值类型
*/
private boolean isNumberType(BeanPropertyWriter writer) {
Class<?> clazz = ().getRawClass();
return (clazz);
}
/**
* 是否是boolean
*/
private boolean isBooleanType(BeanPropertyWriter writer) {
Class<?> clazz = ().getRawClass();
return ();
}
}
package ;
import ;
import ;
import ;
import ;
import ;
import ;
import .Jackson2ObjectMapperBuilder;
/**
* 配置Jackson实体
*/
@Configuration
public class JacksonConfig {
@Bean
@Primary
@ConditionalOnMissingBean()
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = (false).build();
/** 为objectMapper注册一个带有SerializerModifier的Factory */
(()
.withSerializerModifier(new MyBeanSerializerModifier()));
SerializerProvider serializerProvider = ();
//(new ());
return objectMapper;
}
}
格式化date类型可以在properties或者yml中进行配置
全局统一
#date类型时间格式化
#-format=yyyy-MM-dd HH:mm:ss
#-date-time-format=yyyy-MM-dd HH:mm:ss
#-zone=GMT+8
#date类型转换时间戳
-dates-as-timestamps=true