Skip to content

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

Open
He-Pin wants to merge 1 commit into
databricks:masterfrom
He-Pin:fix/parsejson-large-integer
Open

fix: std.parseJson handles integers outside Java long range#1019
He-Pin wants to merge 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

Summary

  • 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
  • Added NumberFormatException catch in ValVisitor.visitFloat64StringParts, falling back to Double.parseDouble

Cross-implementation comparison

Expression cpp-jsonnet 0.21.0 go-jsonnet 0.22.0 jrsonnet 0.5.0-pre99 sjsonnet (before) sjsonnet (after)
parseJson("9223372036854775808") 9223372036854775808 9223372036854775808 9.22e+18 CRASH 9.22e+18
parseJson("-9223372036854775809") -9223372036854775808 -9223372036854775808 -9.22e+18 CRASH -9.22e+18
parseJson("99999999999999999999999999999999") 10^31 (float) 10^31 (float) 10^31 (float) CRASH 10^31 (float) ✅
parseJson("42") 42 42 42 42 42

Test plan

  • ./mill sjsonnet.jvm[3.3.7].test — all suites green
  • New regression test: parsejson_large_integer.jsonnet

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 ✅ |
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.

1 participant