springboot默认使用jackson作为json解析框架,如果使用fastjson,可以按照下列方式配置使用
<dependencies>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.58version>
dependency>
dependencies>
注: fastjson爆出远程代码执行高危漏洞,影响范围FastJSON 1.2.30及以下版本,FastJSON 1.2.41至1.2.45版本;官方建议升级至FastJSON最新版本,建议升级至1.2.58版本。
继承WebMvcConfigurerAdapter类,重写configureMessageConverters方法;在springboot2.x版本中WebMvcConfigurerAdapter类已经过时了
@Configuration
@EnableWebMvc
public class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
/**
* 配置FastJson为方式一
* @return*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
/*
* 1、需要先定义一个convert转换消息的对象 2、添加fastJson的配置信息,比如:是否要格式化返回json数据 3、在convert中添加配置信息
* 4、将convert添加到converters当中
*
*/
// 1、需要先定义一个·convert转换消息的对象;
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
// 2、添加fastjson的配置信息,比如 是否要格式化返回json数据
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
// 3、在convert中添加配置信息.
fastConverter.setFastJsonConfig(fastJsonConfig);
// 4、将convert添加到converters当中.
converters.add(fastConverter);
}
}
在App.java启动类中,注入Bean : HttpMessageConverters
@Configuration
public class HttpConverterConfig {
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
// 1.定义一个converters转换消息的对象
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
// 2.添加fastjson的配置信息,比如: 是否需要格式化返回的json数据
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
//解决中文乱码问题:在方法内部添加这段代码
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON);
fastConverter.setSupportedMediaTypes(fastMediaTypes);
// 3.在converter中添加配置信息
fastJsonConfig.setCharset(Charset.forName("UTF-8"));
fastConverter.setFastJsonConfig(fastJsonConfig);
// 4.将converter赋值给HttpMessageConverter
HttpMessageConverter<?> converter = fastConverter;
// 5.返回HttpMessageConverters对象
return new HttpMessageConverters(converter);
}
}
在实体类中:
private int id;
private String name;
//com.alibaba.fastjson.annotation.JSONField
@JSONField(format="yyyy-MM-dd HH:mm")
private Date createTime;//创建时间.
/*
* serialize:是否需要序列化属性.
*/
@JSONField(serialize=false)
private String remarks;//备注信息.
那么这时候在实体类中使用@JSONField(serialize=false),是不是此字段就不返回了,如果是的话,那么恭喜你配置成功了,其中JSONField的包路径是:com.alibaba.fastjson.annotation.JSONField。
package com.alibaba.fastjson.serializer;
/**
* @author wenshao
*/
public enum SerializerFeature {
QuoteFieldNames,//输出key时是否使用双引号,默认为true
/**
*
*/
UseSingleQuotes,//使用单引号而不是双引号,默认为false
/**
*
*/
WriteMapNullValue,//是否输出值为null的字段,默认为false
/**
*
*/
WriteEnumUsingToString,//Enum输出name()或者original,默认为false
/**
*
*/
UseISO8601DateFormat,//Date使用ISO8601格式输出,默认为false
/**
* @since 1.1
*/
WriteNullListAsEmpty,//List字段如果为null,输出为[],而非null
/**
* @since 1.1
*/
WriteNullStringAsEmpty,//字符类型字段如果为null,输出为"",而非null
/**
* @since 1.1
*/
WriteNullNumberAsZero,//数值字段如果为null,输出为0,而非null
/**
* @since 1.1
*/
WriteNullBooleanAsFalse,//Boolean字段如果为null,输出为false,而非null
/**
* @since 1.1
*/
SkipTransientField,//如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true
/**
* @since 1.1
*/
SortField,//按字段名称排序后输出。默认为false
/**
* @since 1.1.1
*/
@Deprecated
WriteTabAsSpecial,//把\t做转义输出,默认为false
/**
* @since 1.1.2
*/
PrettyFormat,//结果是否格式化,默认为false
/**
* @since 1.1.2
*/
WriteClassName,//序列化时写入类型信息,默认为false。反序列化是需用到
/**
* @since 1.1.6
*/
DisableCircularReferenceDetect,//消除对同一对象循环引用的问题,默认为false
/**
* @since 1.1.9
*/
WriteSlashAsSpecial,//对斜杠'/'进行转义
/**
* @since 1.1.10
*/
BrowserCompatible,//将中文都会序列化为\uXXXX格式,字节数会多一些,但是能兼容IE 6,默认为false
/**
* @since 1.1.14
*/
WriteDateUseDateFormat,//全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
/**
* @since 1.1.15
*/
NotWriteRootClassName,//暂不知,求告知
/**
* @since 1.1.19
*/
DisableCheckSpecialChar,//一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false
/**
* @since 1.1.35
*/
BeanToArray //暂不知,求告知
;
private SerializerFeature(){
mask = (1 << ordinal());
}
private final int mask;
public final int getMask() {
return mask;
}
public static boolean isEnabled(int features, SerializerFeature feature) {
return (features & feature.getMask()) != 0;
}
public static int config(int features, SerializerFeature feature, boolean state) {
if (state) {
features |= feature.getMask();
} else {
features &= ~feature.getMask();
}
return features;
}
}
参考:
http://www.cnblogs.com/xujie09/p/8461483.html
https://blog.csdn.net/xuqingge/article/details/53561529