前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java进阶|Springboot切换fastjson序列化实战

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

原创
作者头像
Aion
发布2024-01-28 23:51:26
4321
发布2024-01-28 23:51:26
举报

前言

在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腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 什么是Fastjson
  • Jackson和Fastjson区别
  • SpringBoot中Fastjson实战
    • (1)创建SpringBoot项目
      • (2)引入Fastjson依赖
        • (3)切换Fastjson配置xml
          • (4)配置Fastjson数据转换
            • (5)测试Fastjson
            • 完整的pom.xml引入
            • 使用Fastjson注意点
            • 总结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档