我在Springboot项目中,使用@Configuration的方式配置使用fastjson作为默认的json工具。
`@Configuration
public class FastJsonConfiguration implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.removeIf(converter -> converter instanceof MappingJackson2HttpMessageConverter);
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
FastJsonConfig config = new FastJsonConfig();
config.setSerializerFeatures(SerializerFeature.WriteNullListAsEmpty, // List类型字段为null时输出[]而非null
SerializerFeature.WriteMapNullValue, // 显示空字段
SerializerFeature.WriteNullStringAsEmpty, // 字符串类型字段为null时输出""而非null
SerializerFeature.WriteNullBooleanAsFalse, // Boolean类型字段为null时输出false而null
SerializerFeature.PrettyFormat, // 美化json输出,否则会作为整行输出
SerializerFeature.WriteNullNumberAsZero, // 数值字段如果为null,输出为0,而非null
SerializerFeature.WriteNullBooleanAsFalse, // Boolean字段如果为null,输出为false,而非null
SerializerFeature.WriteDateUseDateFormat, // 时间格式yyyy-MM-dd HH: mm: ss
SerializerFeature.DisableCircularReferenceDetect); // 禁用循环引用检测
converter.setFastJsonConfig(config);
converters.add(0,converter);
List<MediaType> supportedMediaTypes = new ArrayList<>();
supportedMediaTypes.add(MediaType.APPLICATION_JSON);
supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
supportedMediaTypes.add(MediaType.APPLICATION_PDF);
supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
supportedMediaTypes.add(MediaType.APPLICATION_XML);
supportedMediaTypes.add(MediaType.IMAGE_GIF);
supportedMediaTypes.add(MediaType.IMAGE_JPEG);
supportedMediaTypes.add(MediaType.IMAGE_PNG);
supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
supportedMediaTypes.add(MediaType.TEXT_HTML);
supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);
supportedMediaTypes.add(MediaType.TEXT_PLAIN);
supportedMediaTypes.add(MediaType.TEXT_XML);
converter.setSupportedMediaTypes(supportedMediaTypes);
}
}`
但是,Controller返回实体时并没有按照配置里设置的SerializerFeature去执行。
比如我把上面代码中SerializerFeature.PrettyFormat注释掉,
依然不会把返回结果显示为一行。
再比如SerializerFeature.WriteNullStringAsEmpty时,字符串依然是null。
是我理解的有错吗?难道Controller中以Model作为返回结果时没按这个设置去转换?
Springboot版本:2.1.2 RELEASE
FastJson版本:1.2.56
重写实现HttpMessageConverters这个Bean即可,下面的供参考。
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
//1.需要定义一个convert转换消息的对象;
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
//2:添加fastJson的配置信息;
FastJsonConfig fastJsonConfig = new FastJsonConfig();
//第一个SerializerFeature.PrettyFormat可以省略,毕竟这会造成额外的内存消耗和流量,第二个是用来指定当属性值为null是是否输出:pro:null
//SerializerFeature.SkipTransientField
fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteNullStringAsEmpty);
// fastJsonConfig.setSerializerFeatures(SerializerFeature.SkipTransientField);
//3处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
//4.在convert中添加配置信息.
fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
HttpMessageConverter<?> converter = fastJsonHttpMessageConverter;
return new HttpMessageConverters(converter);
}
重写实现
HttpMessageConverters这个Bean即可,下面的供参考。@Bean public HttpMessageConverters fastJsonHttpMessageConverters() { //1.需要定义一个convert转换消息的对象; FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter(); //2:添加fastJson的配置信息; FastJsonConfig fastJsonConfig = new FastJsonConfig(); //第一个SerializerFeature.PrettyFormat可以省略,毕竟这会造成额外的内存消耗和流量,第二个是用来指定当属性值为null是是否输出:pro:null //SerializerFeature.SkipTransientField fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteNullStringAsEmpty); // fastJsonConfig.setSerializerFeatures(SerializerFeature.SkipTransientField); //3处理中文乱码问题 List<MediaType> fastMediaTypes = new ArrayList<>(); fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); //4.在convert中添加配置信息. fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes); fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig); HttpMessageConverter<?> converter = fastJsonHttpMessageConverter; return new HttpMessageConverters(converter); }
非常感谢您的回答,这个方法确实能解决问题。赞!
但我还是好奇configureMessageConverters为何不生效。
再次表示感谢~
fastjson 较新版本中的 FastJsonHttpMessageConverter4 又过期了诶,都推荐使用 FastJsonHttpMessageConverter 了。
Most helpful comment
重写实现
HttpMessageConverters这个Bean即可,下面的供参考。