当前位置:   article > 正文

Spring Boot整合fastjson_springboot fastjson

springboot fastjson

一、概述

SpringBoot在构建restfult风格的web服务时,默认使用的是Jackson作为JSON解析器,个人使用比较习惯的 json 框架是 fastjson,所以SpringBoot默认的 json 使用起来就很陌生了,如何使用 fastjson 进行 json 解析呢?

引入依赖

注意,1.2.61以下有严重高危漏洞,1.2.61修复,必须升级到1.2.61,目前最新版本为1.2.62

  1. <dependency>
  2.     <groupId>com.alibaba</groupId>
  3.     <artifactId>fastjson</artifactId>
  4.     <version>1.2.62</version>
  5. </dependency>

二、SpringBoot1.x版本

第一种方法:通过extends WebMvcConfigurerAdapter并重写configureMessageConverters方法来实现。

  1. import java.util.List;
  2.  
  3. import org.mybatis.spring.annotation.MapperScan;
  4. import org.springframework.boot.SpringApplication;
  5. import org.springframework.boot.autoconfigure.SpringBootApplication;
  6. import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.http.converter.HttpMessageConverter;
  9. import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
  10.  
  11. import com.alibaba.fastjson.serializer.SerializerFeature;
  12. import com.alibaba.fastjson.support.config.FastJsonConfig;
  13. import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
  14. @MapperScan("com.example.demo.mapper")
  15. @SpringBootApplication(scanBasePackages= {"com.example.demo.controller","com.example.demo.service"})
  16. public class HelloSpringBootApplication extends WebMvcConfigurerAdapter{
  17.  
  18.  
  19.  
  20.  @Override
  21.  public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
  22.   
  23.   //创建FastJson的消息转换器
  24.   FastJsonHttpMessageConverter convert = new FastJsonHttpMessageConverter();
  25.   //创建FastJson的配置对象
  26.   FastJsonConfig config = new FastJsonConfig();
  27.   //对Json数据进行格式化
  28.   config.setSerializerFeatures(SerializerFeature.PrettyFormat);
  29.   convert.setFastJsonConfig(config);
  30.   converters.add(convert);
  31.  }
  32.  
  33.  
  34.  
  35.  public static void main(String[] args) {
  36.   
  37.   SpringApplication.run(HelloSpringBootApplication.class, args);
  38.  }
  39.  
  40. }

第二种方法:在项目启动类中通过@Bean注解处理

  1.  
  2. import java.util.List;
  3. import org.mybatis.spring.annotation.MapperScan;
  4. import org.springframework.boot.SpringApplication;
  5. import org.springframework.boot.autoconfigure.SpringBootApplication;
  6. import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.http.converter.HttpMessageConverter;
  9. import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
  10.  
  11. import com.alibaba.fastjson.serializer.SerializerFeature;
  12. import com.alibaba.fastjson.support.config.FastJsonConfig;
  13. import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
  14. @MapperScan("com.example.demo.mapper")
  15. @SpringBootApplication(scanBasePackages= {"com.example.demo.controller","com.example.demo.service"})
  16. public class HelloSpringBootApplication
  17. {
  18.  @Bean
  19.  public HttpMessageConverters fastJsonMessageConverter() {
  20.   
  21.     //创建FastJson的消息转换器
  22.     FastJsonHttpMessageConverter convert = new FastJsonHttpMessageConverter();
  23.     //创建FastJson的配置对象
  24.     FastJsonConfig config = new FastJsonConfig();
  25.     //对Json数据进行格式化
  26.     config.setSerializerFeatures(SerializerFeature.PrettyFormat);
  27.     convert.setFastJsonConfig(config);
  28.     HttpMessageConverter<?> con =convert;
  29.     return new HttpMessageConverters(con);
  30.  }
  31.  
  32.  public static void main(String[] args) {
  33.   
  34.   SpringApplication.run(HelloSpringBootApplication.class, args);
  35.  }
  36.  
  37. }

三、SpringBoot2.0版本

自定义配置类implements WebMvcConfigurer 类

  1. import com.alibaba.fastjson.serializer.SerializerFeature;
  2. import com.alibaba.fastjson.support.config.FastJsonConfig;
  3. import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.http.MediaType;
  6. import org.springframework.http.converter.HttpMessageConverter;
  7. import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
  8. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11. @Configuration
  12. public class JsonConfig implements WebMvcConfigurer {
  13.     /**
  14.      * 使用fastjson代替jackson
  15.      */
  16.     @Override
  17.     public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
  18.         /*
  19.          先把JackSon的消息转换器删除.
  20.          备注: (1)源码分析可知,返回json的过程为:
  21.                     Controller调用结束后返回一个数据对象,for循环遍历conventers,找到支持application/json的HttpMessageConverter,然后将返回的数据序列化成json。
  22.                     具体参考org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor的writeWithMessageConverters方法
  23.                (2)由于是list结构,我们添加的fastjson在最后。因此必须要将jackson的转换器删除,不然会先匹配上jackson,导致没使用fastjson
  24.         */
  25.         for (int i = converters.size() - 1; i >= 0; i--) {
  26.             if (converters.get(i) instanceof MappingJackson2HttpMessageConverter) {
  27.                 converters.remove(i);
  28.             }
  29.         }
  30.         FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
  31.         //自定义fastjson配置
  32.         FastJsonConfig config = new FastJsonConfig();
  33.         config.setSerializerFeatures(
  34.                 SerializerFeature.WriteMapNullValue,        // 是否输出值为null的字段,默认为false,我们将它打开
  35.                 SerializerFeature.WriteNullListAsEmpty,     // 将Collection类型字段的字段空值输出为[]
  36.                 SerializerFeature.WriteNullStringAsEmpty,   // 将字符串类型字段的空值输出为空字符串
  37.                 SerializerFeature.WriteNullNumberAsZero,    // 将数值类型字段的空值输出为0
  38.                 SerializerFeature.WriteDateUseDateFormat,
  39.                 SerializerFeature.DisableCircularReferenceDetect    // 禁用循环引用
  40.         );
  41.         fastJsonHttpMessageConverter.setFastJsonConfig(config);
  42.         // 添加支持的MediaTypes;不添加时默认为*/*,也就是默认支持全部
  43.         // 但是MappingJackson2HttpMessageConverter里面支持的MediaTypes为application/json
  44.         // 参考它的做法, fastjson也只添加application/json的MediaType
  45.         List<MediaType> fastMediaTypes = new ArrayList<>();
  46.         fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
  47.         fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
  48.         converters.add(fastJsonHttpMessageConverter);
  49.     }
  50.     @Override
  51.     public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
  52.         for (HttpMessageConverter<?> messageConverter : converters) {
  53.             System.out.println("=====================" + messageConverter);
  54.         }
  55.     }
  56. }

测试

  1. @RestController
  2. public class TestController {
  3.     @RequestMapping("/test")
  4.     public Object test() {
  5.         User user = new User();
  6.         user.date = new Date();
  7.         user.name = "张三";
  8.         return user;
  9.     }
  10. }
  11. public class User {
  12.     @JSONField(format = "yyyy-MM-dd HH:mm:ss")
  13.     public Date date;
  14.     public String name;
  15. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/1000718
推荐阅读
相关标签
  

闽ICP备14008679号