You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by rm...@apache.org on 2019/08/19 13:03:12 UTC

[johnzon] branch master updated: ensure Json.createValue(BigInteger) does not loose precision

This is an automated email from the ASF dual-hosted git repository.

rmannibucau pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/johnzon.git


The following commit(s) were added to refs/heads/master by this push:
     new fcf8a87  ensure Json.createValue(BigInteger) does not loose precision
fcf8a87 is described below

commit fcf8a875e4a8fc33039ad6262136af495fc27a94
Author: Romain Manni-Bucau <rm...@gmail.com>
AuthorDate: Mon Aug 19 15:03:08 2019 +0200

    ensure Json.createValue(BigInteger) does not loose precision
---
 .../java/org/apache/johnzon/core/JsonProviderImpl.java     | 14 +++++++-------
 .../main/java/org/apache/johnzon/core/JsonReaderImpl.java  |  7 ++++++-
 .../test/java/org/apache/johnzon/core/JsonParserTest.java  |  9 +++++++++
 3 files changed, 22 insertions(+), 8 deletions(-)

diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java
index deeb3e2..282f286 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java
@@ -155,33 +155,33 @@ public class JsonProviderImpl extends JsonProvider implements Serializable {
     }
 
     @Override
-    public JsonString createValue(String value) {
+    public JsonString createValue(final String value) {
         return new JsonStringImpl(value);
     }
 
     @Override
-    public JsonNumber createValue(int value) {
+    public JsonNumber createValue(final int value) {
         return new JsonLongImpl(value);
     }
 
     @Override
-    public JsonNumber createValue(long value) {
+    public JsonNumber createValue(final long value) {
         return new JsonLongImpl(value);
     }
 
     @Override
-    public JsonNumber createValue(double value) {
+    public JsonNumber createValue(final double value) {
         return new JsonDoubleImpl(value);
     }
 
     @Override
-    public JsonNumber createValue(BigDecimal value) {
+    public JsonNumber createValue(final BigDecimal value) {
         return new JsonNumberImpl(value);
     }
 
     @Override
-    public JsonNumber createValue(BigInteger value) {
-        return new JsonLongImpl(value.longValue());
+    public JsonNumber createValue(final BigInteger value) {
+        return new JsonNumberImpl(new BigDecimal(value.toString()));
     }
 
     @Override
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
index 1e3bec4..57bb5a3 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
@@ -138,7 +138,12 @@ public class JsonReaderImpl implements JsonReader {
                 }
                 return JsonValue.NULL;
             case VALUE_NUMBER:
-                final JsonNumber number = new JsonNumberImpl(parser.getBigDecimal());
+                final JsonNumber number;
+                if (parser.isFitLong()) {
+                    number = new JsonLongImpl(parser.getLong());
+                } else {
+                    number = new JsonNumberImpl(parser.getBigDecimal());
+                }
                 if (!subStreamReader) {
                     if (parser.hasNext()) {
                         throw new JsonParsingException("Expected end of file", parser.getLocation());
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java
index 0eac634..bbc8d71 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java
@@ -30,6 +30,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.StringReader;
 import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -70,6 +71,14 @@ public class JsonParserTest {
     }
 
     @Test
+    public void bigInteger() {
+        final BigInteger integer = new BigInteger("123456789012345678901234567890");
+        final JsonParser parser = Json.createParser(new StringReader(Json.createValue(integer).toString()));
+        parser.next();
+        assertEquals(integer, parser.getBigDecimal().toBigInteger());
+    }
+
+    @Test
     public void avoidBufferStrategyLeaks() {
         final Function<JsonParser, String> parse = parser -> {
             final Collection<String> output = new ArrayList<>();