Skip to content

Commit e96e75d

Browse files
committed
fix json-iterator#149, keep the number handling same as jackson, this will break jsoniter old behavior, as we are always using Double
1 parent cf51823 commit e96e75d

File tree

4 files changed

+30
-1
lines changed

4 files changed

+30
-1
lines changed

src/main/java/com/jsoniter/IterImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,15 @@
55
import com.jsoniter.spi.Slice;
66

77
import java.io.IOException;
8+
import java.math.BigInteger;
89

910
class IterImpl {
1011

12+
private static BigInteger maxLong = BigInteger.valueOf(Long.MAX_VALUE);
13+
private static BigInteger minLong = BigInteger.valueOf(Long.MIN_VALUE);
14+
private static BigInteger maxInt = BigInteger.valueOf(Integer.MAX_VALUE);
15+
private static BigInteger minInt = BigInteger.valueOf(Integer.MIN_VALUE);
16+
1117
public static final int readObjectFieldAsHash(JsonIterator iter) throws IOException {
1218
if (readByte(iter) != '"') {
1319
if (nextToken(iter) != '"') {

src/main/java/com/jsoniter/JsonIterator.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,15 @@ public final Object read() throws IOException {
288288
case STRING:
289289
return readString();
290290
case NUMBER:
291-
return readDouble();
291+
double number = readDouble();
292+
if (number == Math.floor(number) && !Double.isInfinite(number)) {
293+
long longNumber = (long) number;
294+
if (longNumber <= Integer.MAX_VALUE && longNumber >= Integer.MIN_VALUE) {
295+
return (int) longNumber;
296+
}
297+
return longNumber;
298+
}
299+
return number;
292300
case NULL:
293301
IterImpl.skipFixedBytes(this, 4);
294302
return null;

src/test/java/com/jsoniter/TestFloat.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,9 @@ public void testBigDecimal() {
8282
BigDecimal number = JsonIterator.deserialize("100.1", BigDecimal.class);
8383
assertEquals(new BigDecimal("100.1"), number);
8484
}
85+
86+
public void testChooseDouble() {
87+
Object number = JsonIterator.deserialize("1.1", Object.class);
88+
assertEquals(1.1, number);
89+
}
8590
}

src/test/java/com/jsoniter/TestInteger.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,4 +199,14 @@ public void testBigInteger() {
199199
BigInteger number = JsonIterator.deserialize("100", BigInteger.class);
200200
assertEquals(new BigInteger("100"), number);
201201
}
202+
203+
public void testChooseInteger() {
204+
Object number = JsonIterator.deserialize("100", Object.class);
205+
assertEquals(100, number);
206+
}
207+
208+
public void testChooseLong() {
209+
Object number = JsonIterator.deserialize(Long.valueOf(Long.MAX_VALUE).toString(), Object.class);
210+
assertEquals(Long.MAX_VALUE, number);
211+
}
202212
}

0 commit comments

Comments
 (0)