java标准库不提供jsonmalformedexception,它是jackson或gson等第三方库中可能自定义的异常;jackson实际抛出jsonparseexception(继承jsonprocessingexception),gson抛出jsonsyntaxexception。

Java 中并没有内置的 JsonMalformedException 类,这是 Jackson 或 Gson 等第三方 JSON 库中定义的异常类型,标准 Java(JDK)本身不提供 JSON 解析能力,也不定义此类异常。因此,“抛出 JsonMalformedException”的前提是你正在使用支持该异常的库(如 Jackson),且需正确配置和捕获。
确认你用的是 Jackson(推荐)
Jackson 的 com.fasterxml.jackson.core.JsonParseException 是实际抛出的异常,而 JsonMalformedException 并非 Jackson 官方类名 —— 很可能是误记或自定义封装。Jackson 在解析非法 JSON 时,默认抛出 JsonParseException(继承自 JsonProcessingException),它已足够标识格式错误。
- 确保依赖了 Jackson Core 和 Databind:
com.fasterxml.jackson.core
jackson-databind
2.15.3 - 解析时直接捕获
JsonProcessingException即可覆盖所有解析失败场景(包括格式错误、类型不匹配等):
ObjectMapper mapper = new ObjectMapper();
try {
MyData data = mapper.readValue(jsonString, MyData.class);
} catch (JsonProcessingException e) {
// 此处 e 就是 JsonParseException(格式错误时)
throw new RuntimeException("JSON 格式错误", e);
}
如果真需要自定义 JsonMalformedException
你可以自己定义一个运行时异常,专门用于封装 JSON 格式问题,并在解析时主动包装原始异常:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 定义异常类:
public class JsonMalformedException extends RuntimeException {
public JsonMalformedException(String message, Throwable cause) {
super(message, cause);
}
}
- 在解析逻辑中识别格式错误并转换:
try {
mapper.readValue(jsonString, MyData.class);
} catch (JsonParseException e) {
throw new JsonMalformedException("JSON 结构不合法: " + e.getOriginalMessage(), e);
} catch (JsonProcessingException e) {
// 其他 JSON 处理异常(如反序列化类型错误),可选择不转或另处理
throw e;
}
避免混淆 Gson 和 Jackson 的异常体系
Gson 使用 JsonSyntaxException 表示语法/格式错误,不是 JsonMalformedException。如果你用的是 Gson,应捕获该异常:
- Gson 示例:
Gson gson = new Gson();
try {
MyData data = gson.fromJson(jsonString, MyData.class);
} catch (JsonSyntaxException e) {
throw new JsonMalformedException("Gson 解析失败:JSON 格式错误", e);
}
- 注意:不要混用库的异常命名,Jackson 没有
JsonMalformedException,Gson 也没有。
调试技巧:定位具体哪一行出错
Jackson 的 JsonParseException 包含精确位置信息,可通过以下方式获取:
-
e.getLocation().getLineNr()—— 出错行号 -
e.getLocation().getColumnNr()—— 出错列号 -
e.getOriginalMessage()—— 原始错误描述(如 "Unexpected character ('a' (code 97))...")
这些信息对日志记录和前端提示非常有用,无需额外封装也能精准定位问题。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










