Java进阶|Springboot切换fastjson序列化实战

2024-01-28 23:51:26 浏览数 (3)

前言

在SpringBoot中,默认情况下使用的是Jackson作为JSON的序列化和反序列化库。但有时候,我们可能需要切换到其他的JSON库,比如Fastjson。Fastjson是阿里巴巴的一个开源项目,它提供了高性能的JSON序列化和反序列化功能。

什么是Fastjson

Fastjson是一个Java库,可用于将Java对象转换为其JSON表示,它也可用于将JSON字符串转换为等效的Java对象。Fastjson可以处理任意Java对象,包括没有源代码的预先存在的对象。

温少在2010年3月加入阿里巴巴至今,Fastjson是监控系统实现的副产品,最后由阿里巴巴开发。

Fastjson可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到Java Bean。Fastjson采用独创的算法,将JSON Parse的速度提升到极致,超过所有其他JSON库,包括曾经号称最快的Jackson。

Fastjson 源码地址:https://github.com/alibaba/fastjson

Fastjson2源码地址:https://github.com/alibaba/fastjson2

Fastjson 中文 Wiki:https://github.com/alibaba/fastjson/wiki/Quick-Start-CN

Jackson和Fastjson区别

Jackson和Fastjson是两个常用的Java JSON处理库,在使用过程中的优缺点如下:

  • 功能对比:Jackson库提供了更多的功能,包括流式API、树模型API和注解支持。Fastjson的API相对简洁,且具有一定的定制性。
  • API复杂性对比:Jackson复杂些;Fastjson简单些。
  • 性能对比:Fastjson目前Java中最快的JSON库。
  • 易用性对比:Fastjson提供了大量静态方法。Jackson需要实例化类,调用相对繁琐。
  • 社区支持情况:Jackson得到了广泛的支持和丰富的文档。Fastjson主要在阿里巴巴的内部项目中应用,但是在阿里巴巴有些项目也开始剔除了Fastjson,例如Nacos。
  • 安全性对比:Fastjson在某些版本中存在已知的安全漏洞很多,但是社区修复速度也是很快,建议使用最新版本(目前有v1.xx.xx版本和v2.xx.xx)。

SpringBoot中Fastjson实战

Jackson和Fastjson在SpringBoot项目中使用方面各有千秋。在实际使用中,可以根据项目的具体需求来选择合适的库。

系统:Macbook Pro 13.2

IDEA:IntelliJ IDEA 2022.3.2 (Ultimate Edition)

JDK:1.8

(1)创建SpringBoot项目

我们为了演示效果,可以使用最快捷的方式创建一个SpringBoot项目。当然下面两个方式都是可以使用IDEA创建一个项目。由于IDEA版本差异,有些操作可能不同,请按照自己IDEA版本进行操作。

【创建一个空项目】

如果熟悉创建项目操作,我们也可以创建一个空项目。操作步骤如下:

我们在IDE中创建一个SpringBoot项目,项目名称为springboot-tool-fastjson,并将项目放在一个合适的位置,例如1⃣️;在语言处,选择Java,例如2⃣️;然后使用maven创建项目,例如3⃣️;JDK环境选择自己电脑默认的即可,也可以按照需要进行选择,例如4⃣,我这里使用JDK8️;最后定位项目所在的分组以及项目所属项目,例如5⃣️。点击Create即可创建项目。

(2)引入Fastjson依赖

如果是使用Maven作为包管理仓库,则需要引入下面的最新版本的依赖包。截止目前为止,在v2版本中最新版本为fastjson-2.0.45。本文作者在操作时,引入此版本。

代码语言:javascript复制
        <!-- 引入fastjson依赖 -->
        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.45</version>
        </dependency>

或者引入阿里巴巴fastjson2-2.0.45

代码语言:javascript复制
<!-- https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2 -->
<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.45</version>
</dependency>

如果是使用Maven作为包管理仓库,则需要引入下面的最新版本的依赖包。截止目前为止,在v1版本中最新版本为fastjson-1.2.83

代码语言:javascript复制
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.83</version>
</dependency>

(3)切换Fastjson配置xml

在我们的pom.xml文件中,默认情况下是使用的jackson,当我们添加Fastjson的依赖后,需要排除掉默认的Jackson依赖(如果你不需要它的话)。

代码语言:javascript复制
        <!-- 引入SpringBoot -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.3.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.3.4.RELEASE</version>
            <!-- 如果你不需要Jackson,可以通过以下方式排除它 -->  
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-json</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

(4)配置Fastjson数据转换

在修改完pom.xml之后,我们需要在请求时处理数据,实现WebMvcConfigurer配置,处理中文乱码等。

代码语言:javascript复制
package org.example.config;

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.ArrayList;
import java.util.List;

/**
 * WebConfig
 *
 * @author Aion.Liu
 * @version v1.0.0
 * @since 2024/1/28 22:39
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 1. 定义一个convert转换消息的对象
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();

        // 2. 添加fastjson的配置信息
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(
                SerializerFeature.PrettyFormat,
                SerializerFeature.WriteMapNullValue,
                SerializerFeature.WriteDateUseDateFormat
        );
        fastConverter.setFastJsonConfig(fastJsonConfig);

        // 3. 处理中文乱码问题
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        fastConverter.setSupportedMediaTypes(fastMediaTypes);

        // 4. 在converters中添加fastjson的配置信息
        converters.add(0, fastConverter);
    }

}

(5)测试Fastjson

启动你的Spring Boot应用,并尝试发送一个HTTP请求。你应该会看到Fastjson被用来序列化和反序列化JSON数据。

完整的pom.xml引入

下面是一个完整的pom.xml引入功能。

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <!-- 引入框架父类 -->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.4.RELEASE</version>
    <relativePath/>
  </parent>

  <groupId>org.example</groupId>
  <artifactId>springboot-tool-fastjson</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>

    <!-- 引入fastjson依赖 -->
    <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>2.0.45</version>
    </dependency>

    <!-- 引入SpringBoot -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>2.3.4.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <version>2.3.4.RELEASE</version>
      <exclusions>
        <exclusion>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-json</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <version>2.3.4.RELEASE</version>
      </plugin>
    </plugins>
  </build>

</project>

使用Fastjson注意点

在使用Fastjson时,需要注意以下几点,以确保代码的正确性和性能。

  • 属性命名规范:Fastjson使用getter和setter方法来获取和设置对象的属性值。因此,需要确保对象的属性名与getter和setter方法名一致,并且遵循Java Bean命名规范。
  • 避免循环引用:在序列化对象时,需要避免对象之间存在循环引用的情况。否则,Fastjson将无法正确地序列化它们,导致无限递归或异常。
  • 小心处理null值:在序列化对象时,需要特别小心处理null值。如果对象的属性值为null,Fastjson会将其序列化为JSON中的空值。在反序列化时,需要确保null值被正确地还原为Java对象的属性值。
  • 小心处理特殊字符:在序列化包含特殊字符(如双引号)的字符串时,需要使用转义字符来避免语法错误。Fastjson提供了默认的转义字符,但也可以自定义转义字符。
  • 注意性能问题:虽然Fastjson的速度很快,但在处理大量数据或复杂对象时,仍然需要注意性能问题。可以考虑使用缓冲输出流、对象池等技术来提高性能。
  • 注意版本兼容性:Fastjson的版本不同,可能导致API和使用方式有所不同。因此,在升级Fastjson版本时,需要仔细阅读官方文档并测试代码以确保兼容性。

总结

作为一个Java开发工程师,应该熟悉使用fastjson。此外,还应该了解其他JSON工具,例如Gson、Jackson等。本文详细介绍在SpringBoot项目中如何使用Fastjson,以及去除默认Jackson工具的方法来使用fastjson,希望对其他开发者有帮助。


我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

1 人点赞