From 30fa1c1e8ee5ec241a56597e737d97a8f303ff2b Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Sat, 8 Apr 2023 12:53:37 +0200 Subject: [PATCH 1/3] [jsonp] fix issue with big int handing --- .../datatype/jsonp/JsonValueDeserializer.java | 29 ++++++------------- .../jsonp/JsonValueDeserializationTest.java | 20 +++++++++++++ 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/jakarta-jsonp/src/main/java/com/fasterxml/jackson/datatype/jsonp/JsonValueDeserializer.java b/jakarta-jsonp/src/main/java/com/fasterxml/jackson/datatype/jsonp/JsonValueDeserializer.java index 256ef317..e4a9692d 100644 --- a/jakarta-jsonp/src/main/java/com/fasterxml/jackson/datatype/jsonp/JsonValueDeserializer.java +++ b/jakarta-jsonp/src/main/java/com/fasterxml/jackson/datatype/jsonp/JsonValueDeserializer.java @@ -115,11 +115,7 @@ protected JsonObject _deserializeObject(JsonParser p, DeserializationContext ctx b.addNull(name); break; case VALUE_NUMBER_FLOAT: - if (p.getNumberType() == NumberType.BIG_DECIMAL) { - b.add(name, p.getDecimalValue()); - } else { - b.add(name, p.getDoubleValue()); - } + b.add(name, p.getDecimalValue()); break; case VALUE_NUMBER_INT: // very cumbersome... but has to be done @@ -177,11 +173,7 @@ protected JsonArray _deserializeArray(JsonParser p, DeserializationContext ctxt) b.addNull(); break; case VALUE_NUMBER_FLOAT: - if (p.getNumberType() == NumberType.BIG_DECIMAL) { - b.add(p.getDecimalValue()); - } else { - b.add(p.getDoubleValue()); - } + b.add(p.getDecimalValue()); break; case VALUE_NUMBER_INT: // very cumbersome... but has to be done @@ -224,13 +216,10 @@ protected JsonValue _deserializeScalar(JsonParser p, DeserializationContext ctxt // very cumbersome... but has to be done { JsonArrayBuilder b = _builderFactory.createArrayBuilder(); - if (p.getNumberType() == NumberType.BIG_DECIMAL) { - return b.add(p.getDecimalValue()).build().get(0); - } - return b.add(p.getDoubleValue()).build().get(0); + return b.add(p.getDecimalValue()).build().get(0); } - case VALUE_NUMBER_INT: - // very cumbersome... but has to be done + case VALUE_NUMBER_INT: + // very cumbersome... but has to be done { JsonArrayBuilder b = _builderFactory.createArrayBuilder(); switch (p.getNumberType()) { @@ -242,16 +231,16 @@ protected JsonValue _deserializeScalar(JsonParser p, DeserializationContext ctxt return b.add(p.getBigIntegerValue()).build().get(0); } } - case VALUE_STRING: - return _builderFactory.createArrayBuilder().add(p.getText()).build().get(0); - default: // errors, should never get here + case VALUE_STRING: + return _builderFactory.createArrayBuilder().add(p.getText()).build().get(0); + default: // errors, should never get here // case END_ARRAY: // case END_OBJECT: // case FIELD_NAME: // case NOT_AVAILABLE: // case START_ARRAY: // case START_OBJECT: - return (JsonValue) ctxt.handleUnexpectedToken(getValueType(ctxt), p); + return (JsonValue) ctxt.handleUnexpectedToken(getValueType(ctxt), p); } } } diff --git a/jakarta-jsonp/src/test/java/com/fasterxml/jackson/datatype/jsonp/JsonValueDeserializationTest.java b/jakarta-jsonp/src/test/java/com/fasterxml/jackson/datatype/jsonp/JsonValueDeserializationTest.java index d0347440..aa11c164 100644 --- a/jakarta-jsonp/src/test/java/com/fasterxml/jackson/datatype/jsonp/JsonValueDeserializationTest.java +++ b/jakarta-jsonp/src/test/java/com/fasterxml/jackson/datatype/jsonp/JsonValueDeserializationTest.java @@ -7,6 +7,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import java.beans.ConstructorProperties; +import java.math.BigDecimal; public class JsonValueDeserializationTest extends TestBase { @@ -134,4 +135,23 @@ public void testConstructorProperties() throws Exception assertNull(ob2.obj1); assertSame(JsonValue.NULL, ob2.obj2); } + + public void testBigInteger() throws Exception + { + final String JSON = "[2e308]"; + JsonValue v = MAPPER.readValue(JSON, JsonValue.class); + assertTrue(v instanceof JsonArray); + JsonArray a = (JsonArray) v; + assertEquals(1, a.size()); + assertTrue(a.get(0) instanceof JsonNumber); + assertEquals(new BigDecimal("2e308").toBigInteger(), ((JsonNumber) a.get(0)).bigIntegerValue()); + + + // also, should work with explicit type + JsonArray array = MAPPER.readValue(JSON, JsonArray.class); + assertEquals(1, array.size()); + + // and round-tripping ought to be ok: + assertEquals(JSON, serializeAsString(v)); + } } From 7915bb89b86fd616ec6d07b04446345cac13e540 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Sat, 8 Apr 2023 13:02:07 +0200 Subject: [PATCH 2/3] fix test --- .../fasterxml/jackson/datatype/jsonp/JsonValueDeserializer.java | 1 - .../jackson/datatype/jsonp/JsonValueDeserializationTest.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/jakarta-jsonp/src/main/java/com/fasterxml/jackson/datatype/jsonp/JsonValueDeserializer.java b/jakarta-jsonp/src/main/java/com/fasterxml/jackson/datatype/jsonp/JsonValueDeserializer.java index e4a9692d..9b321708 100644 --- a/jakarta-jsonp/src/main/java/com/fasterxml/jackson/datatype/jsonp/JsonValueDeserializer.java +++ b/jakarta-jsonp/src/main/java/com/fasterxml/jackson/datatype/jsonp/JsonValueDeserializer.java @@ -5,7 +5,6 @@ import java.io.IOException; import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonParser.NumberType; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.databind.DeserializationContext; diff --git a/jakarta-jsonp/src/test/java/com/fasterxml/jackson/datatype/jsonp/JsonValueDeserializationTest.java b/jakarta-jsonp/src/test/java/com/fasterxml/jackson/datatype/jsonp/JsonValueDeserializationTest.java index aa11c164..080bb916 100644 --- a/jakarta-jsonp/src/test/java/com/fasterxml/jackson/datatype/jsonp/JsonValueDeserializationTest.java +++ b/jakarta-jsonp/src/test/java/com/fasterxml/jackson/datatype/jsonp/JsonValueDeserializationTest.java @@ -152,6 +152,6 @@ public void testBigInteger() throws Exception assertEquals(1, array.size()); // and round-tripping ought to be ok: - assertEquals(JSON, serializeAsString(v)); + assertEquals("[2E+308]", serializeAsString(v)); } } From 8d707d6bb1e50a458313ab2c0d8af8519e1e38b4 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Sat, 8 Apr 2023 13:29:02 +0200 Subject: [PATCH 3/3] Update JsonValueDeserializer.java --- .../jackson/datatype/jsonp/JsonValueDeserializer.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/jakarta-jsonp/src/main/java/com/fasterxml/jackson/datatype/jsonp/JsonValueDeserializer.java b/jakarta-jsonp/src/main/java/com/fasterxml/jackson/datatype/jsonp/JsonValueDeserializer.java index 9b321708..736a2a27 100644 --- a/jakarta-jsonp/src/main/java/com/fasterxml/jackson/datatype/jsonp/JsonValueDeserializer.java +++ b/jakarta-jsonp/src/main/java/com/fasterxml/jackson/datatype/jsonp/JsonValueDeserializer.java @@ -230,16 +230,16 @@ protected JsonValue _deserializeScalar(JsonParser p, DeserializationContext ctxt return b.add(p.getBigIntegerValue()).build().get(0); } } - case VALUE_STRING: - return _builderFactory.createArrayBuilder().add(p.getText()).build().get(0); - default: // errors, should never get here + case VALUE_STRING: + return _builderFactory.createArrayBuilder().add(p.getText()).build().get(0); + default: // errors, should never get here // case END_ARRAY: // case END_OBJECT: // case FIELD_NAME: // case NOT_AVAILABLE: // case START_ARRAY: // case START_OBJECT: - return (JsonValue) ctxt.handleUnexpectedToken(getValueType(ctxt), p); + return (JsonValue) ctxt.handleUnexpectedToken(getValueType(ctxt), p); } } }