SpringBoot中Fastjson的扩展:自定义序列化和反序列化

51 篇文章 0 订阅
25 篇文章 0 订阅

🍁 作者:知识浅谈,CSDN签约讲师,CSDN博客专家,华为云云享专家,阿里云专家博主
📌 擅长领域:全栈工程师、爬虫、ACM算法
🔥 微信:zsqtcyw 联系我领取学习资料

🎈前言

在Spring Boot项目中,数据的序列化和反序列化是一个常见的需求。Fastjson作为一款高性能的JSON处理库,为开发者提供了丰富的扩展点,让我们可以根据实际需求定制序列化和反序列化的行为。本文将介绍如何在Spring Boot中结合Fastjson实现自定义的序列化和反序列化方法。

🎈Fastjson简介

Fastjson是阿里巴巴开源的一个高性能的JSON处理库,它提供了将Java对象与JSON数据相互转换的功能。相比于其他JSON处理库,Fastjson具有处理速度快、功能强大、零依赖等优点。在Spring Boot项目中,我们可以方便地集成Fastjson来处理JSON数据。

🎈自定义序列化方法

假设我们有一个User类,它有一个password字段,我们不希望在序列化时将这个字段暴露给前端。此时,我们可以使用Fastjson的SerializeFilter接口来实现自定义的序列化方法。

🍮实现SerializeFilter接口或其子接口

我们可以选择实现SerializeFilter接口或其子接口(如SimplePropertyPreFilter、PropertyFilter等)来定制序列化逻辑。这里我们选择实现SimplePropertyPreFilter接口。

import com.alibaba.fastjson.serializer.SimplePropertyPreFilter;

public class UserSerializeFilter extends SimplePropertyPreFilter {

    @Override
    public boolean accept(int index, JavaBeanSerializer beanSer, Object object, Object fieldName, Object fieldVal) {
        if ("password".equals(fieldName)) {
            return false; // 过滤password字段
        }
        return true; // 保留其他字段
    }
}

🍮使用自定义的序列化过滤器

在序列化时,我们可以通过JSON.toJSONString方法的重载版本传入自定义的序列化过滤器实例。

import com.alibaba.fastjson.JSON;

public class UserController {

    // ...

    @GetMapping("/user")
    public String getUser() {
        User user = new User();
        user.setName("John");
        user.setPassword("123456");

        UserSerializeFilter filter = new UserSerializeFilter();
        String jsonStr = JSON.toJSONString(user, filter);

        return jsonStr; // 返回不包含password字段的JSON字符串
    }
}

🎈自定义反序列化方法

假设我们有一个特殊的JSON字符串,其中的日期格式不是标准的ISO 8601格式,而是一个自定义的格式。此时,我们可以使用Fastjson的ParserConfig和ParserProcessor来实现自定义的反序列化方法。

🍮创建自定义的日期反序列化处理器

我们可以实现ParserProcessor接口来处理日期格式的反序列化。

import com.alibaba.fastjson.parser.DefaultJSONParser;
import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer;

import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class CustomDateParserProcessor implements ObjectDeserializer {

    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 自定义日期格式

    @Override
    public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
        String dateStr = parser.getLexer().stringVal();
        try {
            return (T) sdf.parse(dateStr);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public int getFastMatchToken() {
        return 0; // 暂时不使用快速匹配
    }
}

🍮配置自定义的日期反序列化处理器

我们需要在ParserConfig中注册自定义的日期反序列化处理器,并将其设置为全局配置。

import com.alibaba.fastjson.parser.ParserConfig;

public class FastjsonConfig {

    public static ParserConfig getGlobalParserConfig() {
        ParserConfig config = new ParserConfig();
        config.putDeserializer(Date.class, new CustomDateParserProcessor()); // 注册自定义的日期反序列化处理器
        return config;
    }
}

🍮使用全局配置进行反序列化

在反序列化时,我们可以使用配置好的ParserConfig实例来进行反序列化操作。

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;

public class UserService {

    // ...

    public User parseUserFromJson**(续)**

`parseUserFromJson` 方法将使用我们之前定义的 `FastjsonConfig` 中的 `ParserConfig` 实例来反序列化一个包含特殊日期格式的 JSON 字符串到 `User` 对象。

首先,我们假设 `User` 类中有一个 `Date` 类型的字段,比如 `birthday`:

```java
public class User {
    private String name;
    private Date birthday; // 假设这里有一个Date类型的字段
    // ... getters and setters ...
}

然后,我们可以在 UserService 类中编写 parseUserFromJson 方法:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;

public class UserService {

    // ...

    public User parseUserFromJson(String jsonStr) {
        // 使用自定义的ParserConfig进行反序列化
        ParserConfig config = FastjsonConfig.getGlobalParserConfig();
        return JSON.parseObject(jsonStr, User.class, config);
    }

    // ...
}

在这个方法中,我们首先通过 FastjsonConfig.getGlobalParserConfig() 方法获取到配置了自定义日期反序列化处理器的 ParserConfig 实例,然后使用 JSON.parseObject 方法,并传入这个 ParserConfig 实例,将 JSON 字符串反序列化为 User 对象。

现在,当我们有一个包含自定义日期格式的 JSON 字符串时,就可以通过 UserService 的 parseUserFromJson 方法将其正确地反序列化为 User 对象了。

需要注意的是,如果你在整个项目中都使用自定义的 ParserConfig,你可能需要将它设置为 Fastjson 的全局配置。这可以通过在 Spring Boot 的配置类中做以下设置来实现:

import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;

import java.util.List;

@Configuration
public class FastjsonConfig {

    @Bean
    public HttpMessageConverter<?> fastJsonHttpMessageConverter() {
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        FastjsonConfig fastjsonConfig = new FastjsonConfig();
        // 配置Fastjson的全局设置,比如日期格式、是否输出null值等
        // ...
        fastJsonHttpMessageConverter.setFastJsonConfig(fastjsonConfig);
        // 添加自定义的ParserConfig到FastjsonConfig中
        fastjsonConfig.setParserConfig(getGlobalParserConfig());
        return fastJsonHttpMessageConverter;
    }

    // ... getGlobalParserConfig() 方法与之前定义的一致 ...

    // 如果需要配置多个HttpMessageConverter,可以返回一个List<HttpMessageConverter<?>>
}

这样,整个 Spring Boot 项目中的 Fastjson 使用都将采用这个配置。

🍚总结

大功告成,撒花致谢🎆🎇🌟,关注我不迷路,带你起飞带你富。
作者:码海浮生

Spring Boot使用fastjson 2.0.0版本时,可以通过配置文件或代码方式来设置反序列化配置。以下是常见的配置方式: 1. 配置文件方式 在application.properties或application.yml文件添加如下内容: ``` # 开启AutoType功能 spring.fastjson.parser.autoTypeSupport=true # 关闭ASM功能 spring.fastjson.parser.asmEnable=false ``` 2. 代码方式 在Spring Boot的启动类,可以通过重写configureMessageConverters方法来设置fastjson反序列化配置,例如: ``` @Configuration public class FastJsonConfig extends WebMvcConfigurationSupport { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); FastJsonConfig config = new FastJsonConfig(); // 开启AutoType config.setAutoTypeSupport(true); // 关闭ASM config.setASMEnable(false); converter.setFastJsonConfig(config); converters.add(converter); } } ``` 注意,Spring Boot默认使用Jackson作为JSON处理库,如果想要使用fastjson,则需要排除Jackson并添加fastjson依赖,例如: ``` <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-json</artifactId> </exclusion> </exclusions> </dependency> ``` 以上是一些常见的反序列化配置方式,具体的配置应该根据具体情况进行选择和设置,以确保安全和性能。建议仔细阅读fastjson的官方文档,并参考相关的安全规范和最佳实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值