json解析失败应捕获并包装底层库的真实格式异常:jackson用jsonparseexception,gson用jsonsyntaxexception,org.json用jsonexception;务必以原始异常为cause重抛,避免静默返回null,并结合前置校验提升错误定位精度。

解析 JSON 失败时抛出格式异常,关键不是“随便 throw 一个异常”,而是捕获底层解析库的真实格式异常,并按业务需要包装或重抛。直接 throw new RuntimeException("格式错误") 会丢失原始错误位置、上下文和堆栈,不利于排查和统一处理。
明确捕获具体的格式异常类型
不同 JSON 库抛出的格式类异常不同,必须针对性 catch,不能笼统用 Exception:
-
Jackson:格式错误抛
JsonProcessingException(其子类JsonParseException表示语法层面问题,如括号不匹配、非法字符、未闭合字符串) -
Gson:抛
JsonSyntaxException,消息中通常含“expected”“at line X column Y”等定位信息 -
org.json:抛
JSONException,常见于new JSONObject(str)或new JSONArray(str)时遇到非法 identifier、unexpected token 等
不要吞掉原始异常,要保留根因
catch 后若需抛出新异常,务必把原始异常作为 cause 传入,否则调试时无法看到真实报错点:
- ✅ 正确:
throw new IllegalArgumentException("JSON 格式非法", e); - ❌ 错误:
throw new IllegalArgumentException("JSON 格式非法");(丢失 e) - 避免仅记录日志后静默返回 null —— 后续空指针更难追踪
结合前置校验,让格式异常更早暴露
有些“格式错误”其实可提前拦截,减少解析开销并提升错误提示精度:
- 检查字符串是否为空或纯空白:
jsonStr == null || jsonStr.trim().isEmpty() - 快速预检首尾结构(非替代解析):
jsonStr.trim().startsWith("{") || jsonStr.trim().startsWith("[") - 对已知来源的 JSON(如前端提交),可在 Controller 层用
@Valid+ 自定义注解做轻量格式校验
提供可读性强的自定义格式异常(可选)
如果团队有统一错误码体系,可封装带上下文的异常:
- 定义
JsonFormatException extends RuntimeException - 构造时传入原始字符串片段(如前 50 字)、行号(若解析器支持)、库名
- 例如:
new JsonFormatException("预期 ',' 但得到 '}'", jsonStr.substring(0, Math.min(50, jsonStr.length())), "Jackson")
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











