四、springboot配置FastJson为Spring Boot默认JSON解析框架

前言

springboot默认使用jackson作为json解析框架,如果使用fastjson,可以按照下列方式配置使用

1.pom文件引入依赖库:

<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版本。

2.在启动类中配置

2.1配置方式一(通过继承的方式)

​ 继承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);
    }

}

2.2配置方式二(通过@Bean注入的方式)

在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。

fastjson中SerializerFeature的用法及中文注解

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

你可能感兴趣的:(springboot)