Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Support Integers outside the range [-(2**53)+1, (2**53)-1] #292

Copy link
Copy link
@azaslavsky

Description

@azaslavsky
Issue body actions

This is issue is somewhat related these two issues, but is not so much concerned with handling BigInt literals (ex: 12n) as simply supporting very absolutely large numbers, namely those that fall outside the [-(2**53)+1, (2**53)-1] range recommended by the JSON spec.

My specific use case is potentially using JSON5 as the human-readable for of a binary serialization format. For this purpose, expanding the range of support to [-(2**63)+1, (2**64)-1] is sufficient. However, in the Javascript case this requires using BigInt anyway, which can be arbitrarily large, so expanding to this range would implicitly allow any valid JSON number to be successfully parsed and stringified.

This is currently not supported, as seen here:

let j5 = require('json5');
let parsed = j5.parse('{"min_int64": -9223372036854775808, "max_int64": 9223372036854775807, "max_uint64": 18446744073709551615}');
console.log(parsed);

/* Logs the following - all 3 values are incorrect!
{
  min_int64: -9223372036854776000,
  max_int64: 9223372036854776000,
  max_uint64: 18446744073709552000
} */

I wonder if it wouldn't be possible to extend the library to automatically process these to and from BigInts when parsing and stringifying, respectively? To maintain ES5 compatibility, I imagine this could look something like:

  1. Check that typeof BigInt == 'function' on startup. If this returns false, then no flag is set, and all code proceeds as it does today (ie, mangling very large integers in the manner seen above). If true, the library sets some flag, USE_BIG_INT or similar, to true.
  2. Modify the parser and stringifier to check this flag, and iff the flag is true, optionally process the flag to/from BigInt if necessary.

Would this be a desirable feature for this library? If so, I am happy to do the implementation.

dschu012, rangav, mbehr1 and raggi

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      Morty Proxy This is a proxified and sanitized view of the page, visit original site.