解决 Spring Boot 2.x 使用 FastJson 1.2.x 序列化响应数据 null 字段不显示的问题
Spring Boot 2.x 项目,接口增加了几个字段,历史数据默认为 null,接口响应时这几个字段没有显示。查了下项目的 JSON 组件,用的 FastJson,默认序列化的时候忽略了这几个 null 字段。但前端需要使用字段,即使为 null 的场景。好久没用 FastJson 了,特此记录下。
环境信息
- Spring Boot 2.4.5
- FastJson 1.2.73
解决方法
项目内 FastJson 全局配置如下,如果想修改全局配置,可以增加 SerializerFeature.WriteMapNullValue 序列化特性。
本次的问题我不打算修改全局配置,以避免影响到其他接口。
java
public HttpMessageConverter<Object> fastConverter() {
//1、定义一个convert转换消息的对象
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//2、添加fastjson的配置信息
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
fastJsonConfig.setCharset(StandardCharsets.UTF_8);
fastJsonConfig.setSerializeFilters((ValueFilter) (object, name, value) -> {
if (value != null && value.getClass() == Long.class ) {
return String.valueOf(value);
}
return value;
});
//2-1 处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastConverter.setSupportedMediaTypes(fastMediaTypes);
//3、在convert中添加配置信息
fastConverter.setFastJsonConfig(fastJsonConfig);
// fastjson已使用黑白名单用于防御反序列化漏洞,经研究该利用在特定条件下可绕过默认autoType关闭限制,攻击远程服务器
// fastjson在1.2.68及之后的版本中引入了safeMode,配置safeMode后,无论白名单和黑名单,都不支持autoType,可杜绝反序列化Gadgets类变种攻击(关闭autoType注意评估对业务的影响).
// https://github.com/alibaba/fastjson/wiki/security_update_20220523
ParserConfig.getGlobalInstance().setSafeMode(true);
return fastConverter;
}那么除了全局配置之外,就是在对应响应实体的字段上增加注解解决了。
java
@JSONField(serialzeFeatures= {SerializerFeature.WriteMapNullValue})
private String foo;参考资料
- Springboot 2.x fastJson 返回json数据中null字段不显示解决方法:https://blog.csdn.net/qq_36174487/article/details/95491603
