From 7301d3c8def0d8ae7b137ea6f6b583cb6cda3309 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Mon, 3 Nov 2025 12:18:50 -0800 Subject: [PATCH 1/2] (WIP) Fix #1418: last test passes --- .../core/filter/FilteringParserDelegate.java | 23 +++++++++++++++++++ .../ParserFilterEmpty1418Test.java | 6 ++--- 2 files changed, 25 insertions(+), 4 deletions(-) rename src/test/java/com/fasterxml/jackson/core/{tofix => filter}/ParserFilterEmpty1418Test.java (96%) 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 1d81b8cfef..b51644001c 100644 --- a/src/main/java/com/fasterxml/jackson/core/filter/FilteringParserDelegate.java +++ b/src/main/java/com/fasterxml/jackson/core/filter/FilteringParserDelegate.java @@ -672,8 +672,22 @@ protected final JsonToken _nextToken2() throws IOException f = _headContext.getFilter(); if ((f != null) && (f != TokenFilter.INCLUDE_ALL)) { boolean includeEmpty = f.includeEmptyObject(_headContext.hasCurrentName()); + // [core#1418]: If object is empty (start not handled), parent is an array, + // and parent wants to include empty arrays, include this empty object + // to preserve array structure + if (!includeEmpty && !returnEnd && _headContext._parent != null + && _headContext._parent.inArray()) { + TokenFilter parentFilter = _headContext._parent.getFilter(); + if ((parentFilter != null) && (parentFilter != TokenFilter.INCLUDE_ALL)) { + includeEmpty = parentFilter.includeEmptyArray(_headContext._parent.hasCurrentIndex()); + } + } f.filterFinishObject(); if (includeEmpty) { + _headContext._currentName = _headContext._parent == null + ? null + : _headContext._parent._currentName; + _headContext._needToHandleName = false; return _nextBuffered(_headContext); } } _headContext = _headContext.getParent(); @@ -847,6 +861,15 @@ protected final JsonToken _nextTokenWithBuffering(final TokenFilterContext buffR f = _headContext.getFilter(); if ((f != null) && (f != TokenFilter.INCLUDE_ALL)) { boolean includeEmpty = f.includeEmptyObject(_headContext.hasCurrentName()); + // [core#1418]: If parent is an array and wants to include empty arrays, + // include this empty object to preserve array structure + if (!includeEmpty && _headContext._parent != null + && _headContext._parent.inArray()) { + TokenFilter parentFilter = _headContext._parent.getFilter(); + if ((parentFilter != null) && (parentFilter != TokenFilter.INCLUDE_ALL)) { + includeEmpty = parentFilter.includeEmptyArray(_headContext._parent.hasCurrentIndex()); + } + } f.filterFinishObject(); if (includeEmpty) { _headContext._currentName = _headContext._parent == null diff --git a/src/test/java/com/fasterxml/jackson/core/tofix/ParserFilterEmpty1418Test.java b/src/test/java/com/fasterxml/jackson/core/filter/ParserFilterEmpty1418Test.java similarity index 96% rename from src/test/java/com/fasterxml/jackson/core/tofix/ParserFilterEmpty1418Test.java rename to src/test/java/com/fasterxml/jackson/core/filter/ParserFilterEmpty1418Test.java index 4aa345c430..67989a1c09 100644 --- a/src/test/java/com/fasterxml/jackson/core/tofix/ParserFilterEmpty1418Test.java +++ b/src/test/java/com/fasterxml/jackson/core/filter/ParserFilterEmpty1418Test.java @@ -1,4 +1,4 @@ -package com.fasterxml.jackson.core.tofix; +package com.fasterxml.jackson.core.filter; import org.junit.jupiter.api.Test; @@ -6,7 +6,6 @@ import com.fasterxml.jackson.core.filter.FilteringParserDelegate; import com.fasterxml.jackson.core.filter.TokenFilter; import com.fasterxml.jackson.core.filter.TokenFilter.Inclusion; -import com.fasterxml.jackson.core.testutil.failure.JacksonTestFailureExpected; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; @@ -39,8 +38,7 @@ public boolean includeEmptyArray(boolean contentsFiltered) { private final JsonFactory JSON_F = newStreamFactory(); - // [core#1418]: case #1: failing - @JacksonTestFailureExpected + // [core#1418]: case #1 @Test void filterArrayWithObjectsEndingWithFilteredProperty1() throws Exception { From 6ad78217092327a6556141e9e0b07891cac6aabb Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Wed, 12 Nov 2025 20:06:05 -0800 Subject: [PATCH 2/2] Remove extra import stmts --- .../jackson/core/filter/ParserFilterEmpty1418Test.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/test/java/com/fasterxml/jackson/core/filter/ParserFilterEmpty1418Test.java b/src/test/java/com/fasterxml/jackson/core/filter/ParserFilterEmpty1418Test.java index 67989a1c09..94cd71865a 100644 --- a/src/test/java/com/fasterxml/jackson/core/filter/ParserFilterEmpty1418Test.java +++ b/src/test/java/com/fasterxml/jackson/core/filter/ParserFilterEmpty1418Test.java @@ -3,8 +3,6 @@ import org.junit.jupiter.api.Test; import com.fasterxml.jackson.core.*; -import com.fasterxml.jackson.core.filter.FilteringParserDelegate; -import com.fasterxml.jackson.core.filter.TokenFilter; import com.fasterxml.jackson.core.filter.TokenFilter.Inclusion; import static org.junit.jupiter.api.Assertions.assertEquals;