Джексон JSON: потреблять только один объект из потока - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь заставить Джексона прочитать один объект из входного потока, а затем прекратить чтение. Похоже, что поведение по умолчанию - читать весь поток и отбрасывать любые посторонние данные, как показано в следующем примере кода:

    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))));

который выводит ->.

Есть ли способ попросить Джексона использовать только данные из InputStream, пока они не прочитают полное значение JSON? Или, наоборот, потерпеть неудачу, если в конце файла есть какие-то посторонние данные?

Я посмотрел на JsonParser.Feature , но я не вижу ничего подходящего.

1 Ответ

0 голосов
/ 10 июля 2019

Вы можете использовать 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 или что-нибудь еще.

...