Skip to content

Commit 6238bcd

Browse files
committed
Support for LARGE numbers (1.17.10)
1 parent da946de commit 6238bcd

4 files changed

Lines changed: 70 additions & 4 deletions

File tree

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<modelVersion>4.0.0</modelVersion>
33
<groupId>co.casterlabs</groupId>
44
<artifactId>rson</artifactId>
5-
<version>1.17.8</version>
5+
<version>1.17.10</version>
66

77
<properties>
88
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

src/main/java/co/casterlabs/rakurai/json/deserialization/JsonNumberParser.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
package co.casterlabs.rakurai.json.deserialization;
22

3-
import static co.casterlabs.rakurai.CharStrings.*;
3+
import static co.casterlabs.rakurai.CharStrings.strcontainsonly;
4+
import static co.casterlabs.rakurai.CharStrings.strcpy;
5+
import static co.casterlabs.rakurai.CharStrings.strdropchars;
6+
import static co.casterlabs.rakurai.CharStrings.strequals;
7+
import static co.casterlabs.rakurai.CharStrings.strfindex;
8+
9+
import java.math.BigDecimal;
10+
import java.math.BigInteger;
411

512
import co.casterlabs.rakurai.json.Rson.RsonConfig;
613
import co.casterlabs.rakurai.json.element.JsonNumber;
@@ -49,11 +56,20 @@ public ParsedTokenPair readToken(char[] in, int skip, @NonNull RsonConfig settin
4956

5057
try {
5158
if ((strfindex(read, '.') == -1) && (strfindex(read, 'E') == -1) && (strfindex(read, 'e') == -1)) {
52-
value = Long.parseLong(num);
59+
try {
60+
value = Long.parseLong(num);
61+
} catch (NumberFormatException ignored) {
62+
value = new BigInteger(num); // See if it's a big integer instead...
63+
}
5364
} else {
54-
value = Double.parseDouble(num);
65+
try {
66+
value = Long.parseLong(num);
67+
} catch (NumberFormatException ignored) {
68+
value = new BigDecimal(num); // See if it's a big decimal instead...
69+
}
5570
}
5671
} catch (NumberFormatException e) {
72+
e.printStackTrace();
5773
throw new JsonLexException();
5874
}
5975
} else {

src/main/java/co/casterlabs/rakurai/json/element/JsonNumber.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package co.casterlabs.rakurai.json.element;
22

3+
import java.math.BigDecimal;
4+
import java.math.BigInteger;
5+
36
import co.casterlabs.rakurai.json.serialization.JsonSerializationContext;
47
import lombok.AllArgsConstructor;
58
import lombok.EqualsAndHashCode;
@@ -39,6 +42,24 @@ public void serializeToObject(@NonNull String key, @NonNull JsonSerializationCon
3942
ctx.insertObjectNumber(key, this.value);
4043
}
4144

45+
/* Big */
46+
47+
public boolean isDecimal() {
48+
return this.value instanceof Double || this.value instanceof BigDecimal;
49+
}
50+
51+
public boolean isBig() {
52+
return this.value instanceof BigInteger || this.value instanceof BigDecimal;
53+
}
54+
55+
public BigInteger bigInteger() {
56+
return (BigInteger) this.value;
57+
}
58+
59+
public BigDecimal bigDecimal() {
60+
return (BigDecimal) this.value;
61+
}
62+
4263
/* Proxy */
4364

4465
@Override

src/test/java/LargeLongs.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import co.casterlabs.rakurai.json.Rson;
2+
import co.casterlabs.rakurai.json.element.JsonObject;
3+
import co.casterlabs.rakurai.json.serialization.JsonParseException;
4+
import co.casterlabs.rakurai.json.validation.JsonValidationException;
5+
6+
public class LargeLongs {
7+
8+
public static void main(String[] args) throws JsonValidationException, JsonParseException {
9+
System.out.println(
10+
Rson.DEFAULT
11+
.fromJson("{\"very_long\": 16849904360176333000}", JsonObject.class)
12+
);
13+
System.out.println(
14+
Rson.DEFAULT
15+
.fromJson("{\"very_long\": -16849904360176333000}", JsonObject.class)
16+
);
17+
18+
// Ensure that we didn't break anything.
19+
System.out.println(
20+
Rson.DEFAULT
21+
.fromJson("{\"very_long\": 1684990436000}", JsonObject.class)
22+
);
23+
System.out.println(
24+
Rson.DEFAULT
25+
.fromJson("{\"very_long\": -1684990436000}", JsonObject.class)
26+
);
27+
}
28+
29+
}

0 commit comments

Comments
 (0)