From 09e2ff9c4f5c74ffb5fe997dd11fe224e9e3a72b Mon Sep 17 00:00:00 2001 From: "Kim, Joo Hyuk" Date: Wed, 29 Nov 2023 02:23:08 +0900 Subject: [PATCH 1/3] Update BaseMapTest.java --- src/test/java/com/fasterxml/jackson/databind/BaseMapTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/fasterxml/jackson/databind/BaseMapTest.java b/src/test/java/com/fasterxml/jackson/databind/BaseMapTest.java index cdb04570b6..98490b2a63 100644 --- a/src/test/java/com/fasterxml/jackson/databind/BaseMapTest.java +++ b/src/test/java/com/fasterxml/jackson/databind/BaseMapTest.java @@ -244,7 +244,7 @@ public static ObjectMapper newJsonMapper() { } // @since 2.10 - protected static JsonMapper.Builder jsonMapperBuilder() { + public static JsonMapper.Builder jsonMapperBuilder() { return JsonMapper.builder(); } From 3a129e437bbec291132c3bb9cc980190f8264224 Mon Sep 17 00:00:00 2001 From: "Kim, Joo Hyuk" Date: Wed, 29 Nov 2023 02:23:09 +0900 Subject: [PATCH 2/3] Create BigDecimalForFloatDisabled3133Test.java --- .../BigDecimalForFloatDisabled3133Test.java | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/test/java/com/fasterxml/jackson/databind/deser/jdk/BigDecimalForFloatDisabled3133Test.java diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/jdk/BigDecimalForFloatDisabled3133Test.java b/src/test/java/com/fasterxml/jackson/databind/deser/jdk/BigDecimalForFloatDisabled3133Test.java new file mode 100644 index 0000000000..c8bced1daf --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/databind/deser/jdk/BigDecimalForFloatDisabled3133Test.java @@ -0,0 +1,61 @@ +package com.fasterxml.jackson.databind.deser.jdk; + +import static com.fasterxml.jackson.databind.BaseMapTest.jsonMapperBuilder; +import static com.fasterxml.jackson.databind.BaseTest.a2q; +import static org.junit.Assert.assertTrue; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.util.HashMap; +import java.util.Map; +import org.junit.jupiter.api.Test; + +/** + * Unit test proving that below issue is fixed. + *

+ * [databind#3133] Map deserialization results in different numeric classes based on json + * ordering (BigDecimal / Double) when used in combination with @JsonSubTypes + */ +public class BigDecimalForFloatDisabled3133Test +{ + @JsonTypeInfo( + use = JsonTypeInfo.Id.NAME, + include = JsonTypeInfo.As.PROPERTY, + property = "type") + + @JsonSubTypes({ + @JsonSubTypes.Type(value = TestMapContainer.class, name = "MAP"), + }) + interface TestJsonTypeInfoInterface { } + + static class TestMapContainer implements TestJsonTypeInfoInterface { + + private Map map = new HashMap<>(); + + public Map getMap() { + return map; + } + + public void setMap(Map map) { + this.map = map; + } + } + + private final ObjectMapper mapper = jsonMapperBuilder() + .disable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS) + .build(); + + @Test + public void testDeserializeWithDifferentOrdering() throws Exception { + // case 1 : type first + String ordering1 = a2q("{'type': 'MAP','map': { 'doubleValue': 0.1 }}"); + TestMapContainer model1 = mapper.readValue(ordering1, TestMapContainer.class); + assertTrue(model1.getMap().get("doubleValue") instanceof Double); + + // case 2 : value first + String ordering2 = a2q("{'map': { 'doubleValue': 0.1 }, 'type': 'MAP'}"); + TestMapContainer model2 = mapper.readValue(ordering2, TestMapContainer.class); + assertTrue(model2.getMap().get("doubleValue") instanceof Double); + } +} From 39028de42134f1a61c3aa475881591b6c936538a Mon Sep 17 00:00:00 2001 From: "Kim, Joo Hyuk" Date: Wed, 29 Nov 2023 02:26:56 +0900 Subject: [PATCH 3/3] Reorder imports --- .../jdk/BigDecimalForFloatDisabled3133Test.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/jdk/BigDecimalForFloatDisabled3133Test.java b/src/test/java/com/fasterxml/jackson/databind/deser/jdk/BigDecimalForFloatDisabled3133Test.java index c8bced1daf..66be09685c 100644 --- a/src/test/java/com/fasterxml/jackson/databind/deser/jdk/BigDecimalForFloatDisabled3133Test.java +++ b/src/test/java/com/fasterxml/jackson/databind/deser/jdk/BigDecimalForFloatDisabled3133Test.java @@ -1,16 +1,18 @@ package com.fasterxml.jackson.databind.deser.jdk; -import static com.fasterxml.jackson.databind.BaseMapTest.jsonMapperBuilder; -import static com.fasterxml.jackson.databind.BaseTest.a2q; -import static org.junit.Assert.assertTrue; +import java.util.HashMap; +import java.util.Map; + import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; -import java.util.HashMap; -import java.util.Map; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import static com.fasterxml.jackson.databind.BaseMapTest.jsonMapperBuilder; +import static com.fasterxml.jackson.databind.BaseTest.a2q; + /** * Unit test proving that below issue is fixed. *

@@ -51,11 +53,11 @@ public void testDeserializeWithDifferentOrdering() throws Exception { // case 1 : type first String ordering1 = a2q("{'type': 'MAP','map': { 'doubleValue': 0.1 }}"); TestMapContainer model1 = mapper.readValue(ordering1, TestMapContainer.class); - assertTrue(model1.getMap().get("doubleValue") instanceof Double); + Assertions.assertTrue(model1.getMap().get("doubleValue") instanceof Double); // case 2 : value first String ordering2 = a2q("{'map': { 'doubleValue': 0.1 }, 'type': 'MAP'}"); TestMapContainer model2 = mapper.readValue(ordering2, TestMapContainer.class); - assertTrue(model2.getMap().get("doubleValue") instanceof Double); + Assertions.assertTrue(model2.getMap().get("doubleValue") instanceof Double); } }