为何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
相关产品推荐
相关产品推荐

