FilteringParserDelegate cannot deserialize empty list (original) (raw)

This is a follow up issue of #700 .

If using FilteringParserDelegate to filter out a part of json, it throws the following exception when the input json is an empty list ("[]").

com.fasterxml.jackson.databind.exc.MismatchedInputException: No content to map due to end-of-input
 at [Source: (byte[])"[]"; line: 1, column: 2]

    at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)
    at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:4688)
    at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:4561)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2823)
    at com.alibaba.dapr.serialization.json.FilteringParserDelegateTest.testFilteringParserDelegateWithEmptyList(FilteringParserDelegateTest.java:36)

Test case:

package com.alibaba.dapr.serialization.json;

import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.filter.FilteringParserDelegate; import com.fasterxml.jackson.core.filter.TokenFilter; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test;

import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map;

import static org.junit.Assert.assertTrue;

public class FilteringParserDelegateTest { @Test public void testFilteringParserDelegateWithEmptyList() throws IOException { ObjectMapper mapper = new ObjectMapper(); final TokenFilter tokenFilter = new TokenFilter() { @Override public TokenFilter includeProperty(String name) { if ("@type".equals(name)) { return null; } return INCLUDE_ALL; } };

    byte[] content = "[]".getBytes(StandardCharsets.UTF_8);

    JsonParser jp = mapper.createParser(content);
    JsonParser jsonParser = new FilteringParserDelegate(jp, tokenFilter, TokenFilter.Inclusion.INCLUDE_ALL_AND_PATH, true);

    List<Map<String, String>> a = mapper.readValue(jsonParser, new TypeReference<List<Map<String, String>>>() {});
    assertTrue(a.isEmpty());
}

}

Jackson version: 2.12.3