Skip to content

Commit 0aa97a7

Browse files
committed
Merge branch '2.17' into 2.18
2 parents e67a3ec + 58889b0 commit 0aa97a7

File tree

3 files changed

+84
-0
lines changed

3 files changed

+84
-0
lines changed

release-notes/VERSION-2.x

+4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ a pure JSON library.
1919
#1391: Fix issue where the parser can read back old number state when
2020
parsing later numbers
2121
(fix contributed by @pjfanning)
22+
#1397: Jackson changes additional values to infinite in case of special
23+
JSON structures and existing infinite values
24+
(reported by @Rodenstock)
25+
(fix contributed by @pjfanning)
2226

2327
2.18.2 (27-Nov-2024)
2428

src/main/java/com/fasterxml/jackson/core/base/ParserBase.java

+3
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,7 @@ protected final JsonToken resetInt(boolean negative, int intLen)
592592
_fractLength = 0;
593593
_expLength = 0;
594594
_numTypesValid = NR_UNKNOWN; // to force decoding
595+
_numberString = null;
595596
return JsonToken.VALUE_NUMBER_INT;
596597
}
597598

@@ -606,6 +607,7 @@ protected final JsonToken resetFloat(boolean negative, int intLen, int fractLen,
606607
_fractLength = fractLen;
607608
_expLength = expLen;
608609
_numTypesValid = NR_UNKNOWN; // to force decoding
610+
_numberString = null;
609611
return JsonToken.VALUE_NUMBER_FLOAT;
610612
}
611613

@@ -616,6 +618,7 @@ protected final JsonToken resetAsNaN(String valueStr, double value)
616618
_numberDouble = value;
617619
_numTypesValid = NR_DOUBLE;
618620
_numberIsNaN = true;
621+
_numberString = null;
619622
return JsonToken.VALUE_NUMBER_FLOAT;
620623
}
621624

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package com.fasterxml.jackson.core.read;
2+
3+
import com.fasterxml.jackson.core.JUnit5TestBase;
4+
import com.fasterxml.jackson.core.JsonParser;
5+
import com.fasterxml.jackson.core.JsonToken;
6+
import com.fasterxml.jackson.core.TokenStreamFactory;
7+
import org.junit.jupiter.api.Test;
8+
9+
import static org.junit.jupiter.api.Assertions.assertEquals;
10+
11+
class NumberParsing1397Test extends JUnit5TestBase
12+
{
13+
private TokenStreamFactory JSON_F = newStreamFactory();
14+
15+
final String radiusValue = "179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
16+
final String INPUT_JSON = a2q("{ 'results': [ { " +
17+
"'radius': " + radiusValue + ", " +
18+
"'type': 'center', " +
19+
"'center': { " +
20+
"'x': -11.0, " +
21+
"'y': -2.0 } } ] }");
22+
23+
// [jackson-core#1397]
24+
@Test
25+
public void issue1397() throws Exception
26+
{
27+
for (int mode : ALL_MODES) {
28+
testIssue(JSON_F, mode, INPUT_JSON, true);
29+
testIssue(JSON_F, mode, INPUT_JSON, false);
30+
}
31+
}
32+
33+
private void testIssue(final TokenStreamFactory jsonF,
34+
final int mode,
35+
final String json,
36+
final boolean checkFirstNumValues) throws Exception
37+
{
38+
// checkFirstNumValues=false reproduces the issue in https://github.com/FasterXML/jackson-core/issues/1397
39+
try (JsonParser p = createParser(jsonF, mode, json)) {
40+
assertToken(JsonToken.START_OBJECT, p.nextToken());
41+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
42+
assertEquals("results", p.currentName());
43+
assertToken(JsonToken.START_ARRAY, p.nextToken());
44+
assertToken(JsonToken.START_OBJECT, p.nextToken());
45+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
46+
assertEquals("radius", p.currentName());
47+
assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken());
48+
assertEquals(JsonParser.NumberType.BIG_INTEGER, p.getNumberType());
49+
assertEquals(radiusValue, p.getNumberValueDeferred());
50+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
51+
assertEquals("type", p.currentName());
52+
assertToken(JsonToken.VALUE_STRING, p.nextToken());
53+
assertEquals("center", p.getText());
54+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
55+
assertEquals("center", p.currentName());
56+
assertToken(JsonToken.START_OBJECT, p.nextToken());
57+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
58+
assertEquals("x", p.currentName());
59+
assertToken(JsonToken.VALUE_NUMBER_FLOAT, p.nextToken());
60+
if (checkFirstNumValues) {
61+
assertEquals(JsonParser.NumberType.DOUBLE, p.getNumberType());
62+
assertEquals(Double.valueOf(-11.0d), p.getNumberValueDeferred());
63+
}
64+
assertEquals(Double.valueOf(-11.0d), p.getDoubleValue());
65+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
66+
assertEquals("y", p.currentName());
67+
assertToken(JsonToken.VALUE_NUMBER_FLOAT, p.nextToken());
68+
assertEquals(JsonParser.NumberType.DOUBLE, p.getNumberType());
69+
assertEquals(Double.valueOf(-2.0d), p.getNumberValueDeferred());
70+
assertEquals(Double.valueOf(-2.0d), p.getDoubleValue());
71+
assertToken(JsonToken.END_OBJECT, p.nextToken());
72+
assertToken(JsonToken.END_OBJECT, p.nextToken());
73+
assertToken(JsonToken.END_ARRAY, p.nextToken());
74+
assertToken(JsonToken.END_OBJECT, p.nextToken());
75+
}
76+
}
77+
}

0 commit comments

Comments
 (0)