BeWithYou

胡搞的技术博客

  1. 首页
  2. Java
  3. springboot使用fastjson统一序列化输出

springboot使用fastjson统一序列化输出


最近在用spring boot写接口,需要统一对外输出序列化后的json字符串。记录一下如何配置fastjson为默认序列化转换器,以及如何将LocalDateTime类型的null值转为""。

@Configuration
public class WebAppConfigurer implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        // 指定时间格式化方法
        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat,
                SerializerFeature.WriteMapNullValue, // 是否输出值为null的字段
                SerializerFeature.WriteNullStringAsEmpty, // 字符类型字段如果为null,输出为”“,而非null
                SerializerFeature.DisableCircularReferenceDetect, // 消除对同一对象循环引用的问题
                SerializerFeature.WriteNullListAsEmpty, // List字段如果为null,输出为[],而非null   
                SerializerFeature.WriteDateUseDateFormat // 全局修改日期格式
        );
                // 可能的中文乱码
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
        fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
        // 自定义ValueFilter 让LocalDateTime需要空字符串而不是null
        fastJsonConfig.setSerializeFilters(
            (ValueFilter) (Object bigObject, String name , Object thisObject) -> {
                try {
                    if (thisObject == null && bigObject != null) {
                        Class t = bigObject.getClass().getDeclaredField(name).getType();
                        // 利用反射判断类型 不能直接用instanceof
                        if (Date.class.isAssignableFrom(t) || LocalDate.class.isAssignableFrom(t) || LocalDateTime.class.isAssignableFrom(t)) {
                            return "";
                        }
                    }
                } catch (Exception e) {}
                return thisObject;
            }
        );
        //这里必须要指定index=0 巨坑
        converters.add(0, fastJsonHttpMessageConverter);
    }
}
回到顶部