Skip to content

Commit 7a28627

Browse files
committed
Merge branch '2.18'
2 parents 6d8a09f + 5c76113 commit 7a28627

File tree

7 files changed

+69
-60
lines changed

7 files changed

+69
-60
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ tools.jackson.core.*;version=${project.version}
278278
<dependency>
279279
<groupId>ch.randelshofer</groupId>
280280
<artifactId>fastdoubleparser</artifactId>
281-
<version>1.0.0</version>
281+
<version>1.0.1</version>
282282
</dependency>
283283

284284
<!-- Test dependencies -->

release-notes/VERSION-2.x

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,9 @@ a pure JSON library.
3838
#1305: Make helper methods of `WriterBasedJsonGenerator` non-final to allow overriding
3939
(contributed by @zhangOranges)
4040
#1310: Add new `StreamReadConstraints` (`maxTokenCount`) to limit maximum number
41-
of Tokens allowed per document
42-
(implemented by @pjfanning)
41+
of Tokens allowed per document#
42+
#1331: Update to FastDoubleParser v1.0.1 to fix `BigDecimal` decoding proble
43+
(fixed by @pjfanning)
4344

4445
2.17.2 (05-Jul-2024)
4546

src/main/java/tools/jackson/core/io/BigDecimalParser.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
public final class BigDecimalParser
2323
{
2424
final static int MAX_CHARS_TO_REPORT = 1000;
25+
private final static int SIZE_FOR_SWITCH_TO_FASTDOUBLEPARSER = 500;
2526

2627
private BigDecimalParser() {}
2728

@@ -39,7 +40,17 @@ private BigDecimalParser() {}
3940
* @throws NumberFormatException for decoding failures
4041
*/
4142
public static BigDecimal parse(String valueStr) {
42-
return parse(valueStr.toCharArray());
43+
try {
44+
if (valueStr.length() < SIZE_FOR_SWITCH_TO_FASTDOUBLEPARSER) {
45+
return new BigDecimal(valueStr);
46+
}
47+
return JavaBigDecimalParser.parseBigDecimal(valueStr);
48+
49+
// 20-Aug-2022, tatu: Although "new BigDecimal(...)" only throws NumberFormatException
50+
// operations by "parseBigDecimal()" can throw "ArithmeticException", so handle both:
51+
} catch (ArithmeticException | NumberFormatException e) {
52+
throw _parseFailure(e, valueStr);
53+
}
4354
}
4455

4556
/**
@@ -59,7 +70,7 @@ public static BigDecimal parse(String valueStr) {
5970
*/
6071
public static BigDecimal parse(final char[] chars, final int off, final int len) {
6172
try {
62-
if (len < 500) {
73+
if (len < SIZE_FOR_SWITCH_TO_FASTDOUBLEPARSER) {
6374
return new BigDecimal(chars, off, len);
6475
}
6576
return JavaBigDecimalParser.parseBigDecimal(chars, off, len);
@@ -172,4 +183,5 @@ private static String _generateExceptionMessage(final String valueToReport, fina
172183
return String.format("Value %s can not be deserialized as `java.math.BigDecimal`, reason: %s" ,
173184
valueToReport, desc);
174185
}
186+
175187
}

src/test/java/tools/jackson/core/io/BigDecimalParserTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.math.BigDecimal;
44

5+
import ch.randelshofer.fastdoubleparser.JavaBigDecimalParser;
56
import org.junit.jupiter.api.Test;
67

78
import tools.jackson.core.JUnit5TestBase;
@@ -53,6 +54,18 @@ void longValidStringFastParse() {
5354
assertEquals(EXP, BigDecimalParser.parseWithFastParser(num.toCharArray(), 0, num.length()));
5455
}
5556

57+
@Test
58+
void issueDatabind4694() {
59+
final String str = "-11000.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
60+
final BigDecimal expected = new BigDecimal(str);
61+
assertEquals(expected, JavaBigDecimalParser.parseBigDecimal(str));
62+
assertEquals(expected, BigDecimalParser.parse(str));
63+
assertEquals(expected, BigDecimalParser.parseWithFastParser(str));
64+
final char[] arr = str.toCharArray();
65+
assertEquals(expected, BigDecimalParser.parse(arr, 0, arr.length));
66+
assertEquals(expected, BigDecimalParser.parseWithFastParser(arr, 0, arr.length));
67+
}
68+
5669
static String genLongInvalidString() {
5770
final int len = 1500;
5871
final StringBuilder sb = new StringBuilder(len);

src/test/java/tools/jackson/core/read/NumberParsingTest.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ protected JsonFactory jsonFactory() {
3737

3838
}
3939

40+
private final String ISSUE_4694_VALUE =
41+
"-11000.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
42+
4043
/*
4144
/**********************************************************************
4245
/* Tests, Boolean
@@ -1006,6 +1009,41 @@ void negativeMaxNumberLength() {
10061009
}
10071010
}
10081011

1012+
// https://github.com/FasterXML/jackson-databind/issues/4694
1013+
@Test
1014+
void databind4694() throws Exception {
1015+
final BigDecimal expected = new BigDecimal(ISSUE_4694_VALUE);
1016+
for (int mode : ALL_MODES) {
1017+
try (JsonParser p = createParser(mode, String.format(" %s ", ISSUE_4694_VALUE))) {
1018+
assertEquals(JsonToken.VALUE_NUMBER_FLOAT, p.nextToken());
1019+
assertEquals(expected, p.getDecimalValue());
1020+
assertFalse(p.isNaN());
1021+
}
1022+
}
1023+
}
1024+
1025+
void databind4694Double() throws Exception {
1026+
final Double expected = new Double(ISSUE_4694_VALUE);
1027+
for (int mode : ALL_MODES) {
1028+
try (JsonParser p = createParser(mode, String.format(" %s ", ISSUE_4694_VALUE))) {
1029+
assertEquals(JsonToken.VALUE_NUMBER_FLOAT, p.nextToken());
1030+
assertEquals(expected, p.getDoubleValue());
1031+
assertFalse(p.isNaN());
1032+
}
1033+
}
1034+
}
1035+
1036+
void databind4694Float() throws Exception {
1037+
final Float expected = new Float(ISSUE_4694_VALUE);
1038+
for (int mode : ALL_MODES) {
1039+
try (JsonParser p = createParser(mode, String.format(" %s ", ISSUE_4694_VALUE))) {
1040+
assertEquals(JsonToken.VALUE_NUMBER_FLOAT, p.nextToken());
1041+
assertEquals(expected, p.getFloatValue());
1042+
assertFalse(p.isNaN());
1043+
}
1044+
}
1045+
}
1046+
10091047
/*
10101048
/**********************************************************
10111049
/* Helper methods

src/test/java/tools/jackson/failing/BigDecimalParser4694Test.java

Lines changed: 0 additions & 25 deletions
This file was deleted.

src/test/java/tools/jackson/failing/NumberParsing4694Test.java

Lines changed: 0 additions & 30 deletions
This file was deleted.

0 commit comments

Comments
 (0)