杰克逊JSON:仅使用流中的单个对象

时间:2019-07-10 18:15:17

标签: java json jackson inputstream

我试图让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,但看不到任何适用的内容。

1 个答案:

答案 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]

通过StringInputStream或其他任何东西都没关系。