全局异常处理应集中拦截JSON解析异常,按语法错误返回400并脱敏记录,语义错误交由业务校验,配置/响应失败时提供降级路径。

全局异常处理中捕获 JSON 解析失败,核心是把解析逻辑集中收口、统一拦截特定异常类型,并避免让错误穿透到上层或暴露原始数据细节。不建议在每个解析点都写 try-catch,而应通过框架级机制做一次拦截、多处生效。
注册全局 JSON 解析异常处理器
不同语言/框架提供对应扩展点:
- Spring Boot(Jackson):用 @ControllerAdvice + @ExceptionHandler 拦截 JsonProcessingException 及其子类(如 JsonParseException、JsonMappingException),返回标准化错误响应体
- Flask(Python):通过 errorhandler 注册对 json.JSONDecodeError 的全局处理,搭配 request.get_json(silent=True) 预校验可进一步前置过滤
- Dio(Flutter):自定义 ResponseTransformer,在 convert 方法中 catch DioExceptionType.unknown 且 error 属于 JSON 解析类异常,转为业务可识别的 Result.error
区分语法错误与语义错误
全局捕获不能一概而论地返回“解析失败”:
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
- 语法错误(JSONDecodeError / JsonParseException):说明输入非法,记录原始片段(截取前150字符)、HTTP 状态码、请求路径,返回 400 Bad Request
- 语义错误(字段缺失、类型错位、嵌套空值):属于业务逻辑层问题,不应由全局解析器兜底,而应在 DTO 绑定后用 Validator 或手动校验处理
避免日志泄露敏感信息
全局处理器中打印或记录原始 JSON 时必须脱敏:
- 自动过滤含 "password"、"token"、"auth" 等关键词的 key 及其 value
- 使用正则替换手机号、身份证号、邮箱等 PII 字段为 ***
- 生产环境禁用 full stack trace 输出,仅记录异常类型 + 位置(如 JSON 错误偏移量 e.pos)
提供可恢复的降级路径
某些场景下,解析失败不等于服务不可用:
- 配置类 JSON 失败时,加载本地缓存的上一版配置或内置默认值
- 第三方 API 响应解析失败,返回 mock 数据并标记 “data_source=backup” 供监控告警
- 前端传参 JSON 异常,返回带详细提示的表单错误页(如 “第3行缺少引号,请检查 JSON 格式”),而非 500 页面

















