Created
September 10, 2021 22:17
-
-
Save nik9000/3ad414191b05265c6f140209abfa92eb to your computer and use it in GitHub Desktop.
path.patch
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/main/java/com/fasterxml/jackson/core/filter/TokenFilter.java b/src/main/java/com/fasterxml/jackson/core/filter/TokenFilter.java | |
index 3e747491..468bf25c 100644 | |
--- a/src/main/java/com/fasterxml/jackson/core/filter/TokenFilter.java | |
+++ b/src/main/java/com/fasterxml/jackson/core/filter/TokenFilter.java | |
@@ -432,6 +432,14 @@ public class TokenFilter | |
return _includeScalar(); | |
} | |
+ public boolean includeEmptyArray(boolean contentsFiltered) { | |
+ return false; | |
+ } | |
+ | |
+ public boolean includeEmptyObject(boolean contentsFiltered) { | |
+ return false; | |
+ } | |
+ | |
/* | |
/********************************************************** | |
/* Overrides | |
diff --git a/src/main/java/com/fasterxml/jackson/core/filter/TokenFilterContext.java b/src/main/java/com/fasterxml/jackson/core/filter/TokenFilterContext.java | |
index e1bc1ede..9f87951f 100644 | |
--- a/src/main/java/com/fasterxml/jackson/core/filter/TokenFilterContext.java | |
+++ b/src/main/java/com/fasterxml/jackson/core/filter/TokenFilterContext.java | |
@@ -233,6 +233,17 @@ public class TokenFilterContext extends JsonStreamContext | |
{ | |
if (_startHandled) { | |
gen.writeEndArray(); | |
+ } else { | |
+ if ((_filter != null) && (_filter != TokenFilter.INCLUDE_ALL)) { | |
+ boolean filtered = _index > -1; | |
+ if (_filter.includeEmptyArray(filtered)) { | |
+ if (_parent != null) { | |
+ _parent._writePath(gen); | |
+ } | |
+ gen.writeStartArray(); | |
+ gen.writeEndArray(); | |
+ } | |
+ } | |
} | |
if ((_filter != null) && (_filter != TokenFilter.INCLUDE_ALL)) { | |
_filter.filterFinishArray(); | |
@@ -244,6 +255,17 @@ public class TokenFilterContext extends JsonStreamContext | |
{ | |
if (_startHandled) { | |
gen.writeEndObject(); | |
+ } else { | |
+ if ((_filter != null) && (_filter != TokenFilter.INCLUDE_ALL)) { | |
+ boolean filtered = _currentName != null; | |
+ if (_filter.includeEmptyObject(filtered)) { | |
+ if (_parent != null) { | |
+ _parent._writePath(gen); | |
+ } | |
+ gen.writeStartObject(); | |
+ gen.writeEndObject(); | |
+ } | |
+ } | |
} | |
if ((_filter != null) && (_filter != TokenFilter.INCLUDE_ALL)) { | |
_filter.filterFinishObject(); | |
diff --git a/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java b/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java | |
index 5908aa56..1a04d87f 100644 | |
--- a/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java | |
+++ b/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java | |
@@ -614,6 +614,134 @@ public class BasicGeneratorFilteringTest extends BaseTest | |
assertEquals(aposToQuotes("{'f1':1,'f2':12.3,'f3':3}"), w.toString()); | |
} | |
+ public void testIncludeEmptyArrayIfNotFiltered() throws Exception | |
+ { | |
+ StringWriter w = new StringWriter(); | |
+ JsonGenerator gen = new FilteringGeneratorDelegate( | |
+ _createGenerator(w), | |
+ new TokenFilter() { | |
+ @Override | |
+ public boolean includeEmptyArray(boolean contentsFiltered) { | |
+ return !contentsFiltered; | |
+ } | |
+ | |
+ @Override | |
+ public boolean includeNumber(int value) { | |
+ return value > 10; | |
+ } | |
+ }, | |
+ Inclusion.INCLUDE_ALL_AND_PATH, | |
+ true); | |
+ | |
+ gen.writeStartObject(); | |
+ gen.writeArrayFieldStart("empty_array"); | |
+ gen.writeEndArray(); | |
+ gen.writeArrayFieldStart("filtered_array"); | |
+ gen.writeNumber(6); | |
+ gen.writeEndArray(); | |
+ gen.writeEndObject(); | |
+ | |
+ gen.close(); | |
+ assertEquals(aposToQuotes("{'empty_array':[]}"), w.toString()); | |
+ } | |
+ | |
+ public void testIncludeEmptyArray() throws Exception | |
+ { | |
+ StringWriter w = new StringWriter(); | |
+ JsonGenerator gen = new FilteringGeneratorDelegate( | |
+ _createGenerator(w), | |
+ new TokenFilter() { | |
+ @Override | |
+ public boolean includeEmptyArray(boolean contentsFiltered) { | |
+ return true; | |
+ } | |
+ | |
+ @Override | |
+ public boolean includeNumber(int value) { | |
+ return value > 10; | |
+ } | |
+ }, | |
+ Inclusion.INCLUDE_ALL_AND_PATH, | |
+ true); | |
+ | |
+ gen.writeStartObject(); | |
+ gen.writeArrayFieldStart("empty_array"); | |
+ gen.writeEndArray(); | |
+ gen.writeArrayFieldStart("filtered_array"); | |
+ gen.writeNumber(6); | |
+ gen.writeEndArray(); | |
+ gen.writeEndObject(); | |
+ | |
+ gen.close(); | |
+ assertEquals(aposToQuotes("{'empty_array':[],'filtered_array':[]}"), w.toString()); | |
+ } | |
+ | |
+ public void testIncludeEmptyObjectIfNotFiltered() throws Exception | |
+ { | |
+ StringWriter w = new StringWriter(); | |
+ JsonGenerator gen = new FilteringGeneratorDelegate( | |
+ _createGenerator(w), | |
+ new TokenFilter() { | |
+ @Override | |
+ public boolean includeEmptyObject(boolean contentsFiltered) { | |
+ return !contentsFiltered; | |
+ } | |
+ | |
+ @Override | |
+ public boolean includeNumber(int value) { | |
+ return value > 10; | |
+ } | |
+ }, | |
+ Inclusion.INCLUDE_ALL_AND_PATH, | |
+ true); | |
+ | |
+ gen.writeStartObject(); | |
+ gen.writeFieldName("empty_object"); | |
+ gen.writeStartObject(); | |
+ gen.writeEndObject(); | |
+ gen.writeFieldName("filtered_object"); | |
+ gen.writeStartObject(); | |
+ gen.writeNumberField("foo", 6); | |
+ gen.writeEndObject(); | |
+ gen.writeEndObject(); | |
+ | |
+ gen.close(); | |
+ assertEquals(aposToQuotes("{'empty_object':{}}"), w.toString()); | |
+ } | |
+ | |
+ public void testIncludeEmptyObject() throws Exception | |
+ { | |
+ StringWriter w = new StringWriter(); | |
+ JsonGenerator gen = new FilteringGeneratorDelegate( | |
+ _createGenerator(w), | |
+ new TokenFilter() { | |
+ @Override | |
+ public boolean includeEmptyObject(boolean contentsFiltered) { | |
+ return true; | |
+ } | |
+ | |
+ @Override | |
+ public boolean includeNumber(int value) { | |
+ return value > 10; | |
+ } | |
+ }, | |
+ Inclusion.INCLUDE_ALL_AND_PATH, | |
+ true); | |
+ | |
+ gen.writeStartObject(); | |
+ gen.writeFieldName("empty_object"); | |
+ gen.writeStartObject(); | |
+ gen.writeEndObject(); | |
+ gen.writeFieldName("filtered_object"); | |
+ gen.writeStartObject(); | |
+ gen.writeNumberField("foo", 6); | |
+ gen.writeEndObject(); | |
+ gen.writeEndObject(); | |
+ | |
+ gen.close(); | |
+ assertEquals(aposToQuotes("{'empty_object':{},'filtered_object':{}}"), w.toString()); | |
+ } | |
+ | |
private JsonGenerator _createGenerator(Writer w) throws IOException { | |
return JSON_F.createGenerator(w); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This also works: