fastjson 反序列化失败抛出 jsonexception,validationerror 是自定义校验异常而非 fastjson 原生类型;需分层捕获:先 catch jsonexception 处理解析错误,再手动校验并 catch validationerror。

Fastjson 的 ValidationError 并不是反序列化过程中的标准异常类型,它通常出现在使用 JSONValidator 或自定义校验逻辑时,而非默认的 JSON.parseObject() 或 JSON.parseArray() 调用中。真正需要捕获的是反序列化失败时抛出的 com.alibaba.fastjson.JSONException 及其子类(如 ParseException、JSONException),而 ValidationError 多见于配合 @JSONField(serialize = false) 或 JSR-303 校验(需额外集成)场景,Fastjson 本身不原生支持 JSR-303,所以该异常大概率来自你项目中自定义的校验器或封装工具。
明确异常来源:区分 Fastjson 原生异常和自定义 ValidationError
Fastjson 默认反序列化失败会抛出 JSONException(继承自 RuntimeException),常见触发场景包括:JSON 格式错误、字段类型不匹配、无默认构造函数、循环引用等。而 ValidationError 一般是你自己写的校验类(比如解析后调用 validate() 方法)抛出的业务异常,不属于 Fastjson 内置类。确认它是否在你的代码里定义,或是否来自某个扩展包(如 fastjson-extension 中的校验模块)。
- 检查异常堆栈,看
ValidationError的全限定名(如com.example.ValidationError),确认是不是自定义类 - 搜索项目中是否有类似
if (xxx == null) throw new ValidationError(...)的逻辑 - 若用的是 Spring Boot + Fastjson + Hibernate Validator,注意:Fastjson 不自动触发 @Valid 校验,需手动调用
validator.validate()
捕获 Fastjson 原生反序列化异常(推荐方式)
直接 try-catch JSONException 即可覆盖绝大多数解析失败情况,它是 Fastjson 所有解析异常的顶层运行时异常:
- 用
try { JSON.parseObject(json, clazz); } catch (JSONException e) { ... } - 不必单独 catch
ParseException等子类,除非你要做精细化分类处理 - 注意:Fastjson 1.x 版本中
JSONException是 unchecked 异常,无需强制声明;2.x(fastjson2)仍沿用类似设计
统一处理反序列化 + 业务校验异常
如果确实存在 ValidationError,建议将反序列化与校验逻辑分离,并分层捕获:
- 第一层:catch
JSONException—— 处理 JSON 语法/类型错误 - 第二层:解析成功后,再调用校验方法,catch 自定义
ValidationError - 示例:不要在 parse 过程中混入校验逻辑,避免异常类型混乱
避免误用:Fastjson 不自动抛 ValidationError
有人误以为加了 @JSONField 或配置了 ParserConfig 就会抛 ValidationError,其实不会。Fastjson 的字段忽略、默认值、类型转换都是静默处理(失败则设为 null 或抛 JSONException)。若需强校验,必须显式编码:
- 解析后判空、范围检查、正则匹配等
- 借助 Bean Validation(如 Hibernate Validator)+ 自定义注解 + 手动触发校验
- Fastjson2 提供了
JSONReader#getContext().getConfig().setAutoTypeSupport(true)等安全配置,但和 ValidationError 无关
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











