Skip to content

Instantly share code, notes, and snippets.

@nik9000
Created September 10, 2021 22:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nik9000/3ad414191b05265c6f140209abfa92eb to your computer and use it in GitHub Desktop.
Save nik9000/3ad414191b05265c6f140209abfa92eb to your computer and use it in GitHub Desktop.
path.patch
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);
}
@nik9000
Copy link
Author

nik9000 commented Sep 10, 2021

This also works:

+
+    public void testIncludeAllEmptyArrayInObject() 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 includeEmptyArray(boolean contentsFiltered) {
+                        return !contentsFiltered;
+                    }
+
+                    @Override
+                    public boolean includeNumber(int value) {
+                        return value > 10;
+                    }
+                },
+                Inclusion.INCLUDE_ALL_AND_PATH,
+                true);
+
+        gen.writeStartObject();
+        gen.writeObjectFieldStart("object_with_empty_array");
+        gen.writeArrayFieldStart("foo");
+        gen.writeEndArray();
+        gen.writeEndObject();
+        gen.writeObjectFieldStart("object_with_filtered_array");
+        gen.writeArrayFieldStart("foo");
+        gen.writeNumber(5);
+        gen.writeEndArray();
+        gen.writeEndObject();
+        gen.writeEndObject();
+
+        gen.close();
+        assertEquals(aposToQuotes("{'object_with_empty_array':{'foo':[]}}"), w.toString());
+    }
+
+    public void testIncludeAllEmptyObjectInArray() 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 includeEmptyArray(boolean contentsFiltered) {
+                        return !contentsFiltered;
+                    }
+
+                    @Override
+                    public boolean includeNumber(int value) {
+                        return value > 10;
+                    }
+                },
+                Inclusion.INCLUDE_ALL_AND_PATH,
+                true);
+
+        gen.writeStartObject();
+        gen.writeArrayFieldStart("array_with_empty_object");
+        gen.writeStartObject();
+        gen.writeEndObject();
+        gen.writeEndArray();
+        gen.writeArrayFieldStart("array_with_filtered_object");
+        gen.writeStartObject();
+        gen.writeNumberField("foo", 5);
+        gen.writeEndObject();
+        gen.writeEndArray();
+        gen.writeEndObject();
+
+        gen.close();
+        assertEquals(aposToQuotes("{'array_with_empty_object':[{}]}"), w.toString());
+    }
+
+

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment