diff --git a/src/main/java/com/fasterxml/jackson/core/filter/FilteringParserDelegate.java b/src/main/java/com/fasterxml/jackson/core/filter/FilteringParserDelegate.java index f421a24d10..3ec78c3a60 100644 --- a/src/main/java/com/fasterxml/jackson/core/filter/FilteringParserDelegate.java +++ b/src/main/java/com/fasterxml/jackson/core/filter/FilteringParserDelegate.java @@ -754,6 +754,9 @@ protected final JsonToken _nextTokenWithBuffering(final TokenFilterContext buffR if (returnEnd) { return t; } + if (gotEnd) { + return null; + } } continue main_loop; case ID_END_OBJECT: @@ -781,6 +784,9 @@ protected final JsonToken _nextTokenWithBuffering(final TokenFilterContext buffR if (returnEnd) { return t; } + if (gotEnd) { + return null; + } } continue main_loop; diff --git a/src/test/java/com/fasterxml/jackson/core/filter/BasicParserFilteringTest.java b/src/test/java/com/fasterxml/jackson/core/filter/BasicParserFilteringTest.java index 57b6fc7aa8..06375362db 100644 --- a/src/test/java/com/fasterxml/jackson/core/filter/BasicParserFilteringTest.java +++ b/src/test/java/com/fasterxml/jackson/core/filter/BasicParserFilteringTest.java @@ -719,4 +719,48 @@ public void testIncludeEmptyArrayIfNotFilteredAfterFiltered() throws Exception { ); assertEquals(a2q("[{'empty_array':[]}]"), readAndWrite(JSON_F, p)); } + + public void testExcludeObjectAtTheBeginningOfArray() throws Exception { + JsonParser p0 = JSON_F.createParser(a2q( + "{'parent':[{'exclude':false},{'include':true}]}")); + JsonParser p = new FilteringParserDelegate(p0, + new NameMatchFilter(new String[] { "include" } ), + Inclusion.INCLUDE_ALL_AND_PATH, + false // multipleMatches + ); + assertEquals(a2q("{'parent':[{'include':true}]}"), readAndWrite(JSON_F, p)); + } + + public void testExcludeObjectAtTheEndOfArray() throws Exception { + JsonParser p0 = JSON_F.createParser(a2q( + "{'parent':[{'include':true},{'exclude':false}]}")); + JsonParser p = new FilteringParserDelegate(p0, + new NameMatchFilter(new String[] { "include" } ), + Inclusion.INCLUDE_ALL_AND_PATH, + false // multipleMatches + ); + assertEquals(a2q("{'parent':[{'include':true}]}"), readAndWrite(JSON_F, p)); + } + + public void testExcludeObjectInMiddleOfArray() throws Exception { + JsonParser p0 = JSON_F.createParser(a2q( + "{'parent':[{'include-1':1},{'skip':0},{'include-2':2}]}")); + JsonParser p = new FilteringParserDelegate(p0, + new NameMatchFilter(new String[]{"include-1", "include-2"}), + Inclusion.INCLUDE_ALL_AND_PATH, + true // multipleMatches + ); + assertEquals(a2q("{'parent':[{'include-1':1},{'include-2':2}]}"), readAndWrite(JSON_F, p)); + } + + public void testExcludeLastArrayInsideArray() throws Exception { + JsonParser p0 = JSON_F.createParser(a2q( + "['skipped', [], ['skipped']]")); + JsonParser p = new FilteringParserDelegate(p0, + INCLUDE_EMPTY_IF_NOT_FILTERED, + Inclusion.INCLUDE_ALL_AND_PATH, + true // multipleMatches + ); + assertEquals(a2q("[[]]"), readAndWrite(JSON_F, p)); + } }