我试图让Jackson从输入流中读取单个对象,然后停止读取。看起来默认行为是读取整个流并丢弃所有无关数据,如以下代码示例所示:
byte[] data = "{\"hello\": 1} abc".getBytes();
InputStream is = new ByteArrayInputStream(data);
new ObjectMapper().readTree(is);
System.out.println(String.format("-> %s", new String(IOUtils.toByteArray(is))));
输出->
。
是否有一种方法可以要求Jackson在读取完整的JSON值之前仅使用InputStream中的数据?或者,如果文件末尾有任何无关数据,要使其失败?
我看过JsonParser.Feature,但看不到任何适用的内容。
答案 0 :(得分:0)
如果找到任何尾随令牌,则可以使用DeserializationFeature.FAIL_ON_TRAILING_TOKENS
生成JsonParseException
。您只需要在ObjectMapper
中启用它即可:
ObjectMapper mapper = new ObjectMapper()
.enable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS);
JsonNode tree = mapper.readTree(input);
这将产生以下异常:
Exception in thread "main" com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'abc': was expecting ('true', 'false' or 'null')
at [Source: (String)"{"value": "test"} abc"; line: 1, column: 43]
通过String
或InputStream
或其他任何东西都没关系。