FastJSON 实战完整指南:高性能特性 + 必踩深坑全覆盖

发布时间:2026/6/10 13:01:32
FastJSON 实战完整指南:高性能特性 + 必踩深坑全覆盖 FastJSON 实战完整指南高性能特性 必踩深坑全覆盖一、基础认知FastJSON1 vs FastJSON2核心区分1. 版本定位FastJSON 1.xcom.alibaba:fastjson初代版本存在大量高危反序列化漏洞生产禁止使用仅历史遗留项目最高安全修复版1.2.83但仍有架构底层缺陷。FastJSON 2.xcom.alibaba.fastjson2:fastjson2重构全新架构安全机制重写、性能翻倍官方主推企业新项目统一使用。2. 核心优势高性能来源自研序列化/反序列化字节流解析不依赖反射循环吞吐量高于Jackson、Gson内置完整注解体系、日期/枚举/泛型自动适配支持序列化过滤、格式化、JSONPath、流式超大JSON读写兼容标准JSON、JSON5、二进制JSONB格式。二、标准实战基础用法FastJSON2 规范写法1. 序列化对象 → JSON字符串UserusernewUser(1L,张三,LocalDateTime.now());// 基础序列化StringjsonStrJSON.toJSONString(user);// 格式化输出、忽略null值、日期格式化StringprettyJsonJSON.toJSONString(user,SerializerFeature.PrettyFormat,SerializerFeature.WriteDateUseDateFormat,SerializerFeature.WriteNonStringKeyAsString);2. 反序列化JSON → 对象Stringjson{\id\:1,\name\:\张三\};// 普通对象UseruserJSON.parseObject(json,User.class);// 泛型集合ListUseruserListJSON.parseArray(json,User.class);// 泛型复杂DTOResultDTOUserdtoJSON.parseObject(json,newTypeReferenceResultDTOUser(){});3. 注解定制序列化DatapublicclassUser{privateLongid;// 自定义JSON字段名JSONField(nameusername)privateStringname;// 日期格式化JSONField(formatyyyy-MM-dd HH:mm:ss)privateLocalDateTimecreateTime;// 序列化忽略此字段JSONField(serializefalse)privateStringpassword;}三、生产环境必避致命大坑分维度整理一安全类高危坑线上漏洞根源坑1FastJSON 1.x 任意代码执行漏洞最严重原理1.x 默认开启autoTypeSupport反序列化时可通过type指定任意类触发恶意类构造执行命令风险攻击者构造恶意JSON远程服务器执行系统命令、读取文件解决方案新项目直接升级FastJSON2遗留1.x项目强制关闭自动类型白名单限制类// 全局关闭autoTypeParserConfig.getGlobalInstance().setAutoTypeSupport(false);// 业务类加入白名单ParserConfig.getGlobalInstance().addAccept(com.xxx.biz.entity);坑2FastJSON2 autoType 误用风险FastJSON2默认关闭自动类型但手动开启后仍存在风险禁止全局开启autoTypeSupport仅在可控接口局部开启并配置白名单。坑3JSON注入风险序列化用户输入时特殊字符/script、、引号未转义前端渲染触发XSS修复序列化时增加转义特性JSON.toJSONString(obj,SerializerFeature.BrowserSecure);二序列化数据转换坑高频业务报错坑4数字精度丢失Long、BigDecimal 经典问题场景前端传输雪花ID19位LongFastJSON默认将大数字序列化为数字类型JS Number精度丢失错误输出{userId:1423874129837412938}正确方案强制将Long序列化输出字符串// 全局配置JSON.config(JSONWriter.Feature.WriteLongAsString);// 单次序列化指定JSON.toJSONString(user,SerializerFeature.WriteNonStringKeyAsString);// 字段单独注解JSONField(serializeUsingLongToStringSerializer.class)privateLonguserId;坑5日期类兼容灾难LocalDateTime、Date、Timestamp 格式错乱问题1无注解时LocalDateTime序列化为数组[2026,6,9,14,20]前端无法解析问题2Date默认输出毫秒时间戳前后端格式不统一修复方案二选一字段注解固定格式JSONField(format yyyy-MM-dd HH:mm:ss)全局配置日期格式化JSON.config(JSONReader.Feature.SupportSmartDate);JSON.config(JSONWriter.Feature.WriteDateUseDateFormat);坑6null值默认不输出前端字段缺失报错FastJSON默认过滤值为null的字段前端JS读取undefined引发异常解决方案序列化时开启输出nullJSON.toJSONString(obj,SerializerFeature.WriteMapNullValue);配套空值填充规则字符串null输出空串、数字null输出0SerializerFeature.WriteNullStringAsEmpty,SerializerFeature.WriteNullNumberAsZero坑7枚举序列化默认输出name()前端需要code值默认枚举序列化输出枚举名称{status:NORMAL}业务需要编码{status:0}修复实现JSONSerializable自定义枚举序列化或使用注解JSONField(serializeUsing)。三反序列化解析坑线上500高发坑8泛型、嵌套泛型解析丢失类型直接parseObject(json, ResultDTO.class)会丢失泛型T的类型对象内部字段解析为JSONObject必须使用TypeReference捕获泛型// 正确写法ResultDTOUserresultJSON.parseObject(json,newTypeReferenceResultDTOUser(){});// 错误写法泛型丢失ResultDTOUserresultJSON.parseObject(json,ResultDTO.class);坑9驼峰/下划线字段自动匹配失效前端传下划线user_name后端实体驼峰userNameFastJSON默认不自动兼容全局开启下划线兼容ParserConfig.getGlobalInstance().setCompatibleWithJavaBean(true);JSON.config(JSONReader.Feature.AllowUnQuotedFieldNames);坑10空字符串反序列化数字/日期直接抛异常前端传{age:}反序列化Integer字段直接抛出类型转换异常解决方案全局配置开启智能兼容空串JSONReader.Feature.SupportCompatibleEmptyString自定义反序列化处理器空串转为null/默认值。坑11超大JSON文件OOM内存溢出一次性读取GB级JSON字符串全部加载到堆内存正确流式API分段读写不占用完整堆// 流式读取大文件JSONtry(JsonReaderreaderJSONReader.of(newFileInputStream(big.json))){while(reader.hasNext()){Useruserreader.readObject(User.class);}}四框架整合与性能坑坑12SpringMVC 全局消息转换器配置冲突项目同时引入Jackson FastJSONMVC优先使用JacksonFastJSON配置不生效标准FastJSON2 WebMvc配置ConfigurationpublicclassFastJsonConfigimplementsWebMvcConfigurer{OverridepublicvoidconfigureMessageConverters(ListHttpMessageConverter?converters){FastJson2HttpMessageConverterconverternewFastJson2HttpMessageConverter();// 全局序列化特性统一配置JSONWriter.Feature[]features{JSONWriter.Feature.WriteLongAsString,JSONWriter.Feature.WriteMapNullValue,JSONWriter.Feature.WriteDateUseDateFormat};converter.setWriterFeatures(features);converters.add(0,converter);// 放到首位优先执行}}坑13频繁创建ParserConfig、TypeReference引发GC飙升TypeReference每次new会创建匿名内部类大量循环内创建导致元空间上涨解决方案静态常量复用TypeReferenceParserConfig全局单例禁止在循环中new ParserConfig实例。坑14序列化循环引用直接栈溢出实体存在双向关联User ↔ Order互相引用序列化触发StackOverflowError解决方案字段忽略JSONField(serialize false)开启循环引用检测JSON.toJSONString(user,SerializerFeature.DisableCircularReferenceDetect);五版本依赖坑坑15混合引入FastJSON1 FastJSON2 包冲突同时引入fastjson和fastjson2类路径冲突随机抛出类转换异常Maven统一依赖仅保留FastJSON2!-- 正确依赖 FastJSON2 最新稳定版 --dependencygroupIdcom.alibaba.fastjson2/groupIdartifactIdfastjson2/artifactIdversion2.0.48/version/dependency!-- 移除旧版fastjson 1.x --!-- dependencycom.alibaba:fastjson/dependency --坑16低版本FastJSON2存在内存泄漏2.0.30以下版本流式API存在缓冲区泄漏建议统一升级至2.0.40稳定版。四、生产环境标准化最佳实践版本强制规范新项目统一FastJSON2 2.0.48彻底下线FastJSON1全局统一序列化规则Web消息转换器统一配置Long转字符串、输出null、日期格式化、XSS转义安全管控全局关闭autoType仅可控场景白名单开放类型泛型规范所有带泛型的反序列化必须复用静态TypeReference大文件处理一律使用流式JsonReader/JsonWriter禁止一次性加载完整JSON字符串实体规范日期、Long主键、密码敏感字段统一加JSONField注解循环引用业务DO双向关联字段直接关闭序列化避免检测带来性能损耗。五、FastJSON vs Jackson 选型对比补充维度FastJSON2Jackson序列化性能更高字节流解析中等安全机制默认关闭autoType漏洞防护完善无远程执行风险注解易用性JSONField轻量化JsonProperty配置繁琐大JSON流式支持原生完善需要手动封装企业生态阿里中间件、国内微服务适配好SpringBoot默认内置选型建议国内电商、大数据、高吞吐接口项目优先FastJSON2简单单体Spring项目、无大量JSON处理使用原生Jackson减少第三方依赖。