Unable to ignore properties when deserializing. TokenFilter seems broken (original) (raw)

We have the following JSON generated by another JSON library that includes property @type to indicate value types. We want Jackson to ignore @type properties (both root and inner ones) when deserializing the data to Map<Long, Map<Long, Long>>.

{
   "@type":"java.util.LinkedHashMap",
   "111":{
      "@type":"java.util.LinkedHashMap",
      "1":11,
      "2":22
   }
}

What we have tried so far:

None of the above gets what we want.
The closest result we've got is by using TokenFilter. However, there's always something broker no matter what combination of TokenFilter options we choose:

It seems TokenFilter is broken. The following is our test case.

import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 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 com.fasterxml.jackson.databind.ObjectReader; import org.junit.Test;

import java.util.Map;

import static org.junit.Assert.assertEquals;

public class IgnorePropertyTest { private final ObjectMapper mapper = new ObjectMapper(); private final String LONG_INNER_MAP_WITH_AUTO_TYPE = "{"@type":"java.util.LinkedHashMap","111":{"@type":"java.util.LinkedHashMap","1":11,"2":22}}";

@Test
public void testTokenFilter() throws Exception {
    final TokenFilter tokenFilter = new TokenFilter() {
        @Override
        public TokenFilter includeProperty(String name) {
            if ("@type".equals(name)) {
                return null;
            }
            return this;
        }
    };
    JsonParser jsonParser = new FilteringParserDelegate(
            mapper.createParser(LONG_INNER_MAP_WITH_AUTO_TYPE),
            tokenFilter,
            TokenFilter.Inclusion.INCLUDE_ALL_AND_PATH,
            true);
    Map<Long, Map<Long, Long>> data = mapper.readValue(jsonParser, new TypeReference<Map<Long, Map<Long, Long>>>() {});
    check(data);
}

@Test
public void testReader() throws Exception {
    ObjectReader reader = mapper.readerFor(new TypeReference<Map<Long, Map<Long, Long>>>() {});
    Map<Long, Map<Long, Long>> data = reader.withoutAttribute("@type").readValue(LONG_INNER_MAP_WITH_AUTO_TYPE);
    check(data);
}

@Test
public void testMixin() throws Exception {
    ObjectMapper mp = mapper.addMixIn(Map.class, MixIn.class);
    Map<Long, Map<Long, Long>> data = mp.readValue(LONG_INNER_MAP_WITH_AUTO_TYPE, new TypeReference<Map<Long, Map<Long, Long>>>() {});
    check(data);
}

@JsonIgnoreProperties({"@kind"})
private static abstract class MixIn {
}

private void check(Map<Long, Map<Long, Long>> data) {
    assertEquals(1, data.size());
    assertEquals(2, data.get(111L).size());
    assertEquals(11L, (long)data.get(111L).get(1L));
    assertEquals(22L, (long)data.get(111L).get(2L));
}

}

Jackson version: 2.12.3