From 7153dd1517a27157e6f950cd7389f5375b5a3131 Mon Sep 17 00:00:00 2001 From: David Hoffman Date: Fri, 5 Mar 2021 14:23:50 -0600 Subject: [PATCH 1/2] dont track unknown props in buffer if ignoreAllUnknown is true --- .../jackson/databind/deser/BeanDeserializer.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java index 3716d93989..2acf63b93d 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java @@ -506,12 +506,15 @@ protected Object _deserializeUsingPropertyBased(final JsonParser p, final Deseri } continue; } - // Ok then, let's collect the whole field; name and value - if (unknown == null) { - unknown = new TokenBuffer(p, ctxt); + + if(!_ignoreAllUnknown) { + // Ok then, let's collect the whole field; name and value + if (unknown == null) { + unknown = new TokenBuffer(p, ctxt); + } + unknown.writeFieldName(propName); + unknown.copyCurrentStructure(p); } - unknown.writeFieldName(propName); - unknown.copyCurrentStructure(p); } // We hit END_OBJECT, so: From 9965bfacfddc4d4907e274b25d750a5359d2bb58 Mon Sep 17 00:00:00 2001 From: David Hoffman Date: Wed, 17 Mar 2021 15:57:50 -0500 Subject: [PATCH 2/2] add test cases for ingore unknown fields + @JsonAnySetter and @JsonUnwrapped --- ...UnknownPropertyUsingPropertyBasedTest.java | 81 +++++++++++++++++++ .../TestUnknownPropertyDeserialization.java | 42 ++++++++++ 2 files changed, 123 insertions(+) create mode 100644 src/test/java/com/fasterxml/jackson/databind/deser/filter/IgnoreUnknownPropertyUsingPropertyBasedTest.java diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/filter/IgnoreUnknownPropertyUsingPropertyBasedTest.java b/src/test/java/com/fasterxml/jackson/databind/deser/filter/IgnoreUnknownPropertyUsingPropertyBasedTest.java new file mode 100644 index 0000000000..f345da8d90 --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/databind/deser/filter/IgnoreUnknownPropertyUsingPropertyBasedTest.java @@ -0,0 +1,81 @@ +package com.fasterxml.jackson.databind.deser.filter; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonUnwrapped; +import com.fasterxml.jackson.databind.BaseMapTest; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.util.HashMap; +import java.util.Map; + +public class IgnoreUnknownPropertyUsingPropertyBasedTest extends BaseMapTest { + + private final ObjectMapper MAPPER = newJsonMapper(); + + @JsonIgnoreProperties(ignoreUnknown = true) + static class IgnoreUnknownAnySetter { + + int a, b; + + @JsonCreator + public IgnoreUnknownAnySetter(@JsonProperty("a") int a, @JsonProperty("b") int b) { + this.a = a; + this.b = b; + } + + Map props = new HashMap<>(); + + @JsonAnySetter + public void addProperty(String key, Object value) { + props.put(key, value); + } + + @JsonAnyGetter + public Map getProperties() { + return props; + } + } + + @JsonIgnoreProperties(ignoreUnknown = true) + static class IgnoreUnknownUnwrapped { + + int a, b; + + @JsonCreator + public IgnoreUnknownUnwrapped(@JsonProperty("a") int a, @JsonProperty("b") int b) { + this.a = a; + this.b = b; + } + + @JsonUnwrapped + UnwrappedChild child; + + static class UnwrappedChild { + public int x, y; + } + } + + public void testAnySetterWithFailOnUnknownDisabled() throws Exception { + IgnoreUnknownAnySetter value = MAPPER.readValue("{\"a\":1, \"b\":2, \"x\":3, \"y\": 4}", IgnoreUnknownAnySetter.class); + assertNotNull(value); + assertEquals(1, value.a); + assertEquals(2, value.b); + assertEquals(3, value.props.get("x")); + assertEquals(4, value.props.get("y")); + assertEquals(2, value.props.size()); + } + + public void testUnwrappedWithFailOnUnknownDisabled() throws Exception { + IgnoreUnknownUnwrapped value = MAPPER.readValue("{\"a\":1, \"b\": 2, \"x\":3, \"y\":4}", IgnoreUnknownUnwrapped.class); + assertNotNull(value); + assertEquals(1, value.a); + assertEquals(2, value.b); + assertEquals(3, value.child.x); + assertEquals(4, value.child.y); + } + +} diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/filter/TestUnknownPropertyDeserialization.java b/src/test/java/com/fasterxml/jackson/databind/deser/filter/TestUnknownPropertyDeserialization.java index 56d91d52d7..1d2eccd0cd 100644 --- a/src/test/java/com/fasterxml/jackson/databind/deser/filter/TestUnknownPropertyDeserialization.java +++ b/src/test/java/com/fasterxml/jackson/databind/deser/filter/TestUnknownPropertyDeserialization.java @@ -71,6 +71,33 @@ static class IgnoreUnknown { public int a; } + @JsonIgnoreProperties(ignoreUnknown=true) + static class IgnoreUnknownAnySetter { + + Map props = new HashMap<>(); + + @JsonAnySetter + public void addProperty(String key, Object value) { + props.put(key, value); + } + + @JsonAnyGetter + public Map getProperties() { + return props; + } + } + + @JsonIgnoreProperties(ignoreUnknown=true) + static class IgnoreUnknownUnwrapped { + + @JsonUnwrapped + UnwrappedChild child; + + static class UnwrappedChild { + public int a, b; + } + } + @SuppressWarnings("serial") @JsonIgnoreProperties({"a", "d"}) static class IgnoreMap extends HashMap { } @@ -224,6 +251,21 @@ public void testClassWithIgnoreUnknown() throws Exception assertEquals(-3, result.a); } + public void testAnySetterWithFailOnUnknownDisabled() throws Exception + { + IgnoreUnknownAnySetter value = MAPPER.readValue("{\"x\":\"y\", \"a\":\"b\"}", IgnoreUnknownAnySetter.class); + assertNotNull(value); + assertEquals(2, value.props.size()); + } + + public void testUnwrappedWithFailOnUnknownDisabled() throws Exception + { + IgnoreUnknownUnwrapped value = MAPPER.readValue("{\"a\":1, \"b\":2}", IgnoreUnknownUnwrapped.class); + assertNotNull(value); + assertEquals(1, value.child.a); + assertEquals(2, value.child.b); + } + /** * Test that verifies that use of {@link JsonIgnore} will add implicit * skipping of matching properties.