Skip to content

解决 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;

参考资料

  1. Springboot 2.x fastJson 返回json数据中null字段不显示解决方法:https://blog.csdn.net/qq_36174487/article/details/95491603