Skip to content

fix: std.parseJson handles integers outside Java long range#1019

Merged
stephenamar-db merged 1 commit into
databricks:masterfrom
He-Pin:fix/parsejson-large-integer
Jun 24, 2026
Merged

fix: std.parseJson handles integers outside Java long range#1019
stephenamar-db merged 1 commit into
databricks:masterfrom
He-Pin:fix/parsejson-large-integer

Conversation

@He-Pin

@He-Pin He-Pin commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

fix: std.parseJson handles integers outside Java long range

Motivation

std.parseJson crashed with NumberFormatException when parsing JSON integers exceeding Java long range ([-2^63, 2^63-1]). C++ jsonnet, go-jsonnet, and jrsonnet all gracefully parse them as float64.

Modification

  • ValVisitor.scala: Catch NumberFormatException from parseIntegralNum in visitFloat64StringParts, falling back to Double.parseDouble.
  • Added regression test: parsejson_large_integer.jsonnet

Result

Large integers no longer crash; they degrade to float64.

Expression cpp-jsonnet go-jsonnet jrsonnet sjsonnet (before) sjsonnet (after)
parseJson("2^63") 9.22e+18 9.22e+18 9.22e+18 CRASH 9.22e+18
parseJson("-2^63-1") -9.22e+18 -9.22e+18 -9.22e+18 CRASH -9.22e+18
parseJson("42") 42 42 42 42 42

Motivation:
std.parseJson crashed with NumberFormatException when parsing JSON
integers that exceed Java long range ([-2^63, 2^63-1]). C++ jsonnet,
go-jsonnet, and jrsonnet all gracefully parse them as float64.

Modification:
- ValVisitor.scala: Catch NumberFormatException from
  parseIntegralNum and fall back to Double.parseDouble, which
  handles arbitrarily large integers with float64 precision.

Result:
std.parseJson("9223372036854775808") now returns a float64 value
instead of crashing.

Cross-implementation comparison:
| Expression | cpp-jsonnet | go-jsonnet | jrsonnet | sjsonnet (before) | sjsonnet (after) |
|---|---|---|---|---|---|
| parseJson("2^63") | 9223372036854775808 | 9223372036854775808 | 9.22e+18 | CRASH ❌ | 9.22e+18 ✅ |
| parseJson("-2^63-1") | -9223372036854775808 | -9223372036854775808 | -9.22e+18 | CRASH ❌ | -9.22e+18 ✅ |
| parseJson("10^31") | 10^31 (float) | 10^31 (float) | 10^31 (float) | CRASH ❌ | 10^31 (float) ✅ |
| parseJson("42") | 42 | 42 | 42 | 42 ✅ | 42 ✅ |
@stephenamar-db stephenamar-db merged commit 5c98f70 into databricks:master Jun 24, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants