1. 项目概述最近在重构一个老项目时遇到了JSON序列化性能瓶颈于是决定尝试fastjson2这个号称性能炸裂的JSON库。作为Spring Boot开发者集成第三方组件是我们的日常但fastjson2的集成过程还是有些小坑需要特别注意。本文将手把手带你完成Spring Boot与fastjson2的整合并分享我在实际项目中踩过的那些坑。fastjson2作为阿里巴巴开源的JSON处理库相比老版本fastjson在性能和安全性上都有显著提升。官方benchmark显示其序列化速度比Jackson快2-3倍反序列化速度也有30%以上的提升。对于高并发场景的微服务来说这样的性能提升非常诱人。2. 环境准备与依赖配置2.1 创建Spring Boot项目首先使用Spring Initializr创建一个基础项目选择Web依赖。我这里使用的是Spring Boot 3.1.5版本JDK 17。如果你还在用JDK 8需要注意fastjson2对JDK版本的要求。2.2 添加fastjson2依赖在pom.xml中添加以下依赖dependency groupIdcom.alibaba.fastjson2/groupId artifactIdfastjson2/artifactId version2.0.40/version /dependency dependency groupIdcom.alibaba.fastjson2/groupId artifactIdfastjson2-extension-spring5/artifactId version2.0.40/version /dependency特别注意fastjson2-extension-spring5这个扩展包是必须的它提供了Spring MVC的集成支持。很多同学漏掉这个依赖导致配置不生效。3. 核心配置实现3.1 配置消息转换器创建WebMvcConfig配置类替换默认的Jackson转换器Configuration public class WebMvcConfig implements WebMvcConfigurer { Override public void configureMessageConverters(ListHttpMessageConverter? converters) { FastJsonHttpMessageConverter converter new FastJsonHttpMessageConverter(); FastJsonConfig config new FastJsonConfig(); // 设置日期格式 config.setDateFormat(yyyy-MM-dd HH:mm:ss); // 配置序列化特性 config.setWriterFeatures( JSONWriter.Feature.WriteMapNullValue, // 输出空值字段 JSONWriter.Feature.PrettyFormat, // 美化输出 JSONWriter.Feature.WriteBigDecimalAsPlain // 解决BigDecimal精度问题 ); // 配置反序列化特性 config.setReaderFeatures( JSONReader.Feature.FieldBased, JSONReader.Feature.SupportArrayToBean ); converter.setFastJsonConfig(config); converter.setDefaultCharset(StandardCharsets.UTF_8); converter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON)); // 将fastjson转换器放在首位 converters.add(0, converter); } }3.2 创建测试ControllerRestController public class DemoController { GetMapping(/test) public Result test() { User user new User(); user.setId(1L); user.setName(张三); user.setBalance(new BigDecimal(1000.50)); user.setCreateTime(new Date()); return Result.success(user); } }4. 常见问题与解决方案4.1 BigDecimal精度丢失这是fastjson2最常见的问题之一。当序列化BigDecimal类型时可能会出现精度丢失BigDecimal amount new BigDecimal(100.12345); String json JSON.toJSONString(amount); // 输出可能变成100.123解决方案使用WriteBigDecimalAsPlain特性JSON.toJSONString(obj, JSONWriter.Feature.WriteBigDecimalAsPlain);或者在全局配置中添加该特性推荐4.2 日期格式化问题fastjson2对日期的处理比较严格容易出现解析异常。建议在实体类字段上添加JSONField注解JSONField(format yyyy-MM-dd HH:mm:ss) private Date createTime;或者在全局配置中统一设置日期格式config.setDateFormat(yyyy-MM-dd HH:mm:ss);4.3 循环引用问题当对象存在循环引用时fastjson2默认会抛出异常。可以通过以下方式解决config.setWriterFeatures(JSONWriter.Feature.ReferenceDetection);5. 性能优化建议5.1 启用JSONB模式JSONB是fastjson2引入的二进制JSON格式性能更高// 序列化 byte[] jsonbBytes JSONB.toBytes(obj); // 反序列化 User user JSONB.parseObject(jsonbBytes, User.class);5.2 合理配置特性根据业务场景选择合适的特性组合高吞吐场景禁用PrettyFormat严格模式启用SupportSmartMatch低内存消耗启用UseDefaultConstructor5.3 对象池优化对于频繁创建的对象可以使用fastjson2的对象池JSONFactory.setDefaultObjectProvider(new MyObjectProvider());6. 实际项目经验在最近的一个电商项目中我们将Jackson替换为fastjson2后API平均响应时间从15ms降低到9msGC次数也明显减少。特别是在促销活动期间系统稳定性有了显著提升。几个关键经验一定要做充分的压测特别是边缘case日期和BigDecimal字段要特别关注生产环境建议锁定fastjson2版本监控序列化异常日志7. 扩展应用7.1 与Redis集成fastjson2可以优化Redis的序列化性能Bean public RedisTemplateString, Object redisTemplate() { RedisTemplateString, Object template new RedisTemplate(); template.setConnectionFactory(redisConnectionFactory); FastJson2JsonRedisSerializerObject serializer new FastJson2JsonRedisSerializer(Object.class); template.setDefaultSerializer(serializer); return template; }7.2 自定义序列化对于特殊类型可以实现ObjectSerializer接口public class MoneySerializer implements ObjectSerializer { Override public void write(JSONWriter writer, Object object, Object fieldName, Type fieldType, long features) { Money money (Money) object; writer.writeString(money.toString()); } } // 注册序列化器 JSON.register(Money.class, new MoneySerializer());8. 安全注意事项及时更新版本关注fastjson2的安全公告禁用AutoType生产环境务必关闭config.setReaderFeatures(JSONReader.Feature.SupportAutoType);限制反序列化类使用SafeModeJSONFactory.setSafeMode(true);9. 监控与维护建议在项目中添加fastjson2的监控指标Bean public MeterBinder fastjson2Metrics() { return registry - { Gauge.builder(fastjson2.memory, JSON::getMemorySize) .register(registry); }; }定期检查序列化/反序列化耗时内存使用情况异常次数统计10. 迁移建议从fastjson1.x迁移到fastjson2需要注意包名变化com.alibaba.fastjson → com.alibaba.fastjson2API变化部分方法签名调整特性差异某些特性默认值不同性能影响建议逐步迁移AB测试我在实际迁移过程中发现最耗时的不是代码修改而是各种边界条件的测试验证。建议建立一个完整的测试用例集覆盖所有可能的JSON结构。
Spring Boot集成fastjson2实战与性能优化
发布时间:2026/7/18 9:12:56
1. 项目概述最近在重构一个老项目时遇到了JSON序列化性能瓶颈于是决定尝试fastjson2这个号称性能炸裂的JSON库。作为Spring Boot开发者集成第三方组件是我们的日常但fastjson2的集成过程还是有些小坑需要特别注意。本文将手把手带你完成Spring Boot与fastjson2的整合并分享我在实际项目中踩过的那些坑。fastjson2作为阿里巴巴开源的JSON处理库相比老版本fastjson在性能和安全性上都有显著提升。官方benchmark显示其序列化速度比Jackson快2-3倍反序列化速度也有30%以上的提升。对于高并发场景的微服务来说这样的性能提升非常诱人。2. 环境准备与依赖配置2.1 创建Spring Boot项目首先使用Spring Initializr创建一个基础项目选择Web依赖。我这里使用的是Spring Boot 3.1.5版本JDK 17。如果你还在用JDK 8需要注意fastjson2对JDK版本的要求。2.2 添加fastjson2依赖在pom.xml中添加以下依赖dependency groupIdcom.alibaba.fastjson2/groupId artifactIdfastjson2/artifactId version2.0.40/version /dependency dependency groupIdcom.alibaba.fastjson2/groupId artifactIdfastjson2-extension-spring5/artifactId version2.0.40/version /dependency特别注意fastjson2-extension-spring5这个扩展包是必须的它提供了Spring MVC的集成支持。很多同学漏掉这个依赖导致配置不生效。3. 核心配置实现3.1 配置消息转换器创建WebMvcConfig配置类替换默认的Jackson转换器Configuration public class WebMvcConfig implements WebMvcConfigurer { Override public void configureMessageConverters(ListHttpMessageConverter? converters) { FastJsonHttpMessageConverter converter new FastJsonHttpMessageConverter(); FastJsonConfig config new FastJsonConfig(); // 设置日期格式 config.setDateFormat(yyyy-MM-dd HH:mm:ss); // 配置序列化特性 config.setWriterFeatures( JSONWriter.Feature.WriteMapNullValue, // 输出空值字段 JSONWriter.Feature.PrettyFormat, // 美化输出 JSONWriter.Feature.WriteBigDecimalAsPlain // 解决BigDecimal精度问题 ); // 配置反序列化特性 config.setReaderFeatures( JSONReader.Feature.FieldBased, JSONReader.Feature.SupportArrayToBean ); converter.setFastJsonConfig(config); converter.setDefaultCharset(StandardCharsets.UTF_8); converter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON)); // 将fastjson转换器放在首位 converters.add(0, converter); } }3.2 创建测试ControllerRestController public class DemoController { GetMapping(/test) public Result test() { User user new User(); user.setId(1L); user.setName(张三); user.setBalance(new BigDecimal(1000.50)); user.setCreateTime(new Date()); return Result.success(user); } }4. 常见问题与解决方案4.1 BigDecimal精度丢失这是fastjson2最常见的问题之一。当序列化BigDecimal类型时可能会出现精度丢失BigDecimal amount new BigDecimal(100.12345); String json JSON.toJSONString(amount); // 输出可能变成100.123解决方案使用WriteBigDecimalAsPlain特性JSON.toJSONString(obj, JSONWriter.Feature.WriteBigDecimalAsPlain);或者在全局配置中添加该特性推荐4.2 日期格式化问题fastjson2对日期的处理比较严格容易出现解析异常。建议在实体类字段上添加JSONField注解JSONField(format yyyy-MM-dd HH:mm:ss) private Date createTime;或者在全局配置中统一设置日期格式config.setDateFormat(yyyy-MM-dd HH:mm:ss);4.3 循环引用问题当对象存在循环引用时fastjson2默认会抛出异常。可以通过以下方式解决config.setWriterFeatures(JSONWriter.Feature.ReferenceDetection);5. 性能优化建议5.1 启用JSONB模式JSONB是fastjson2引入的二进制JSON格式性能更高// 序列化 byte[] jsonbBytes JSONB.toBytes(obj); // 反序列化 User user JSONB.parseObject(jsonbBytes, User.class);5.2 合理配置特性根据业务场景选择合适的特性组合高吞吐场景禁用PrettyFormat严格模式启用SupportSmartMatch低内存消耗启用UseDefaultConstructor5.3 对象池优化对于频繁创建的对象可以使用fastjson2的对象池JSONFactory.setDefaultObjectProvider(new MyObjectProvider());6. 实际项目经验在最近的一个电商项目中我们将Jackson替换为fastjson2后API平均响应时间从15ms降低到9msGC次数也明显减少。特别是在促销活动期间系统稳定性有了显著提升。几个关键经验一定要做充分的压测特别是边缘case日期和BigDecimal字段要特别关注生产环境建议锁定fastjson2版本监控序列化异常日志7. 扩展应用7.1 与Redis集成fastjson2可以优化Redis的序列化性能Bean public RedisTemplateString, Object redisTemplate() { RedisTemplateString, Object template new RedisTemplate(); template.setConnectionFactory(redisConnectionFactory); FastJson2JsonRedisSerializerObject serializer new FastJson2JsonRedisSerializer(Object.class); template.setDefaultSerializer(serializer); return template; }7.2 自定义序列化对于特殊类型可以实现ObjectSerializer接口public class MoneySerializer implements ObjectSerializer { Override public void write(JSONWriter writer, Object object, Object fieldName, Type fieldType, long features) { Money money (Money) object; writer.writeString(money.toString()); } } // 注册序列化器 JSON.register(Money.class, new MoneySerializer());8. 安全注意事项及时更新版本关注fastjson2的安全公告禁用AutoType生产环境务必关闭config.setReaderFeatures(JSONReader.Feature.SupportAutoType);限制反序列化类使用SafeModeJSONFactory.setSafeMode(true);9. 监控与维护建议在项目中添加fastjson2的监控指标Bean public MeterBinder fastjson2Metrics() { return registry - { Gauge.builder(fastjson2.memory, JSON::getMemorySize) .register(registry); }; }定期检查序列化/反序列化耗时内存使用情况异常次数统计10. 迁移建议从fastjson1.x迁移到fastjson2需要注意包名变化com.alibaba.fastjson → com.alibaba.fastjson2API变化部分方法签名调整特性差异某些特性默认值不同性能影响建议逐步迁移AB测试我在实际迁移过程中发现最耗时的不是代码修改而是各种边界条件的测试验证。建议建立一个完整的测试用例集覆盖所有可能的JSON结构。