背景
现在阿里提供的fastjson 以简单、方便、高效的 一个高效的json框架,而且在业界的使用率也非常的广泛。现在spring 的项目好多的json 转换 还是原始的json 不好理解,学习成本高。使用不够方便,也不够高效。需要fastjson 替代原有的json转换。
对fastjson还有不是很了解的同学可以上网看一下 这个中文 api https://www.w3cschool.cn/fastjson/fastjson-api.html
注意要点:这个整合必须是在spring 4.2版本之上。spring boot 的版本 必须在1.2.0以上。请注意版本选择
spring boot 整合使用fastjson 俩种方式
第一种方式 覆盖 WebMvcConfigurerAdapter 类中的configureMessageConverters方法 可以看
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Autowired
private JwtInterceptor jwtInterceptor;
/**
* 设置资源文件路径
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/statics/**").addResourceLocations("classpath:/statics/");
}
/**
*
* APP接口拦截器
* */
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(jwtInterceptor).addPathPatterns("/*");
}
/**
* 生成json时,将所有Long转换成String
* @param converters
*/
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = jackson2HttpMessageConverter.getObjectMapper();
//生成json时,将所有Long转换成String
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
jackson2HttpMessageConverter.setObjectMapper(objectMapper);
converters.add(0, jackson2HttpMessageConverter);
}
/**
* spring boot 使用fastjson 作为json转换
* @param converters
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters( converters );
//创建fastjson 转换器
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
//创建fastjson 配置类选择格式化方式
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures( SerializerFeature.PrettyFormat );
fastJsonHttpMessageConverter.setFastJsonConfig( fastJsonConfig );
converters.add( fastJsonHttpMessageConverter );
}
}
第二种方式 通过spring的 bean 注入方式 俩种方式的内部代码基本一致。
/**
* 与上面方法是等效的作用。次方法通过bean的注入
* @return
*/
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters(){
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures( SerializerFeature.PrettyFormat );
fastJsonHttpMessageConverter.setFastJsonConfig( fastJsonConfig );
HttpMessageConverter<?> a = fastJsonHttpMessageConverter;
return new HttpMessageConverters(a);
}
可以根据fastJsonConfig.setSerializerFeatures( SerializerFeature.PrettyFormat )选择需要的格式化方式
更多的fastjson 请参照API
名称 | 含义 | 备注 |
---|---|---|
QuoteFieldNames | 输出key时是否使用双引号,默认为true | |
UseSingleQuotes | 使用单引号而不是双引号,默认为false | |
WriteMapNullValue | 是否输出值为null的字段,默认为false | |
WriteEnumUsingToString | Enum输出name()或者original,默认为false | |
UseISO8601DateFormat | Date使用ISO8601格式输出,默认为false | |
WriteNullListAsEmpty | List字段如果为null,输出为[],而非null | |
WriteNullStringAsEmpty | 字符类型字段如果为null,输出为”“,而非null | |
WriteNullNumberAsZero | 数值字段如果为null,输出为0,而非null | |
WriteNullBooleanAsFalse | Boolean字段如果为null,输出为false,而非null | |
SkipTransientField | 如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true | |
SortField | 按字段名称排序后输出。默认为false | |
WriteTabAsSpecial | 把\t做转义输出,默认为false | 不推荐 |
PrettyFormat | 结果是否格式化,默认为false | |
WriteClassName | 序列化时写入类型信息,默认为false。反序列化是需用到 | |
DisableCircularReferenceDetect | 消除对同一对象循环引用的问题,默认为false | |
WriteSlashAsSpecial | 对斜杠’/’进行转义 | |
BrowserCompatible | 将中文都会序列化为\uXXXX格式,字节数会多一些,但是能兼容IE 6,默认为false | |
WriteDateUseDateFormat | 全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat); | |
DisableCheckSpecialChar | 一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false | |
NotWriteRootClassName | 含义 | |
BeanToArray | 将对象转为array输出 | |
WriteNonStringKeyAsString | 含义 | |
NotWriteDefaultValue | 含义 | |
BrowserSecure | 含义 | |
IgnoreNonFieldGetter | 含义 | |
WriteEnumUsingName | 含义 |