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<>();