1.常见格式处理场景
1.为null的字段不允许返回给前端,要求不返回为null字段
2.为null的字段不允许返回给前端,要求为null字段返回,设置为空字符串
3.不为null字符串转化为自定义的字符串格式
2.对应处理方案
1.为null的字段不允许返回给前端,要求不返回为null字段
局部处理方案:具体字段上添加注解:@JsonInclude(JsonInclude.Include.NON_NULL),仅对注解所在字段生效.
全局处理方案:springboot配置文件(yml)中添加配置(整个项目中所有为null的字段都将不显示):
spring:
jackson:
default-property-inclusion: non_null
2.为null的字段不允许返回给前端,要求为null字段返回,设置为空字符串
配置类:
@Configuration
public class JacksonConfig {
@Bean
@Primary
@ConditionalOnMissingBean(ObjectMapper.class)
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
jsonGenerator.writeString("");
}
});
return objectMapper;
}
}
3.不为null字符串转化为自定义的字符串格式
@JsonSerialize或@JsonFormat
具体使用方式参考: mybatis返回日期有.0的处理方案.
4.对为null场景转化为字符串为什么不能使用@JsonSerialize进行处理原因分析
Jackson包中BeanPropertyWriter.java中有以下两个序列化处理器:
// 值为非null的序列化处理器
protected JsonSerializer<Object> _serializer;
// 值为null的序列化处理器,默认返回null值
protected JsonSerializer<Object> _nullSerializer;
BeanPropertyWriter.java中serializeAsField方法对请求响应对象中每个字段执行序列化操作,如果字段为null会执行会由_nullSerializer序列化为null;非null则按照指定的序列化方式进行序列化处理(一般根据业务需求自定义序列化器实现)
public void serializeAsField(Object bean, JsonGenerator gen,
SerializerProvider prov) throws Exception {
// inlined 'get()'
final Object value = (_accessorMethod == null) ? _field.get(bean)
: _accessorMethod.invoke(bean, (Object[]) null);
// 字段为null,_nullSerializer将该字段序列化为null
if (value == null) {
if (_nullSerializer != null) {
gen.writeFieldName(_name);
_nullSerializer.serialize(null, gen, prov);
}
return;
}
// 省略部分代码................
if (_typeSerializer == null) {
// 对于字段返回值为非null序列化操作,具体序列化方式可以自定义实现(自定义序列化类继承JsonSerializer<Object>重写serialize)
ser.serialize(value, gen, prov);
} else {
ser.serializeWithType(value, gen, prov, _typeSerializer);
}
}
欢迎评论区留言讨论,技术成长路上相互帮助相互提高!