{"record":{"id":"624bff6bccaeff57","repo":"apple/pkl","slug":"cannot-parse-s-as-number","errorCode":null,"errorMessage":"Cannot parse `%s` as number.","messagePattern":"Cannot parse `(.+?)` as number\\.","errorType":"exception","errorClass":"ParseException","httpStatus":null,"severity":"error","filePath":"pkl-core/src/main/java/org/pkl/core/stdlib/json/ParserNodes.java","lineNumber":107,"sourceCode":"    @Override\n    public void endBoolean(boolean value) {\n      this.value = value;\n    }\n\n    @Override\n    public void endString(String string) {\n      value = string;\n    }\n\n    @Override\n    public void endNumber(String string) {\n      try {\n        value = Long.valueOf(string);\n      } catch (NumberFormatException e) {\n        try {\n          value = Double.valueOf(string);\n        } catch (NumberFormatException e2) {\n          throw new ParseException(\"Cannot parse `\" + string + \"` as number.\", getLocation());\n        }\n      }\n    }\n\n    @Override\n    public EconomicMap<Object, ObjectMember> startArray() {\n      currPath.push(VmValueConverter.WILDCARD_ELEMENT);\n      return EconomicMaps.create();\n    }\n\n    @Override\n    public void endArray(@Nullable EconomicMap<Object, ObjectMember> members) {\n      assert members != null;\n      value =\n          new VmListing(\n              VmUtils.createEmptyMaterializedFrame(),\n              BaseModule.getListingClass().getPrototype(),\n              members,","sourceCodeStart":89,"sourceCodeEnd":125,"githubUrl":"https://github.com/apple/pkl/blob/f3efcbfc9b60d30053b0536d664948d7aa1b8673/pkl-core/src/main/java/org/pkl/core/stdlib/json/ParserNodes.java#L89-L125","documentation":"While parsing a JSON document, a number token could not be converted to either a Long or a Double. This means the token is syntactically a number per the tokenizer but numerically unrepresentable in Java (typically an out-of-range literal).","triggerScenarios":"Parsing JSON (via Pkl's JSON parser used for `fromJson`/import of `.json`) containing a numeric literal too large or too small for Long/Double, e.g. `1e999` or a 20+ digit integer.","commonSituations":"Importing machine-generated JSON with huge IDs (e.g. 64-bit-plus snowflake IDs serialized as numbers, or `Infinity`-like `1e999` exponents) into Pkl.","solutions":["Quote oversized numbers as strings in the JSON source and convert manually if needed","Fix the generator producing the JSON to emit numbers within Long/Double range","Pre-transform the JSON (e.g. with a script) to normalize extreme numeric literals"],"exampleFix":"// before (input.json)\n{\"id\": 123456789012345678901234567890}\n// after\n{\"id\": \"123456789012345678901234567890\"}","handlingStrategy":"try-catch","validationCode":"function isSafeNumber(n) { return Number.isFinite(n) && Math.abs(n) <= Number.MAX_VALUE && Number.isInteger(n) ? n <= Number.MAX_SAFE_INTEGER || typeof n === 'number' : !Number.isFinite(n); }","typeGuard":"const isInRangeNumber = (s) => { const n = Number(s); return Number.isFinite(n); };","tryCatchPattern":"try { const v = Json.parse(text); } catch (e) { if (e instanceof ParseException && /Cannot parse .* as number/.test(e.message)) { /* normalize the numeric literal */ } else throw e }","preventionTips":["Serialize large IDs as strings in JSON producers","Avoid exponents beyond Double range (e.g. 1e999) in generated JSON","Validate third-party JSON payloads before importing into Pkl"],"tags":["pkl","json","parser","number"],"backgroundTag":"json-parse-error","analyzedSha":"f3efcbfc9b60d30053b0536d664948d7aa1b8673","analyzedAt":"2026-09-08T13:10:45.570Z","contentChangedAt":"2026-09-08T13:10:45.570Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}