You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何ObjectMapper解析含尾随字符的JSON时未报错且仅返回首个对象?

为什么Jackson会解析出第一个Car对象而不是报错?

这事儿其实是Jackson默认的非严格JSON解析行为导致的,我来给你拆解清楚:

1. Jackson的默认宽松解析逻辑

Jackson的ObjectMapper默认开启了宽松(lenient)解析模式,这个模式的设计初衷是尽可能兼容不严格的JSON输入:

  • 当它读取到第一个完整的JSON对象({"id":"1", "name":"hh"})时,已经满足了Car类型的解析要求,就会直接返回这个对象
  • 剩下的 {"id":"2", "name":"ccc"}内容会被它直接忽略,不会触发解析错误

2. 开启严格校验的方法

如果你想让Jackson严格校验JSON格式,只需要关闭宽松解析模式:

ObjectMapper mapper = new ObjectMapper();
// 关闭宽松解析,多余内容会触发异常
mapper.disable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS);
try {
    car = mapper.readValue(json, new TypeReference<Car>() { });
} catch (IOException e) {
    car = null;
    e.printStackTrace(); // 此时会抛出JsonParseException,提示存在多余的未解析内容
}

修改后,当输入的JSON包含多余内容时,就会像你预期的那样抛出解析异常了。

3. 额外建议:解析多个对象的正确方式

如果你的需求是解析多个Car对象,正确的做法是把JSON改成数组格式:

[{"id":"1", "name":"hh"}, {"id":"2", "name":"ccc"}]

然后用TypeReference<List<Car>>来解析:

List<Car> cars = mapper.readValue(json, new TypeReference<List<Car>>() { });

内容的提问来源于stack exchange,提问作者israel berko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 18:52:43