json-bigint

JSON.parse/stringify with bigints support. Based on Douglas Crockford JSON.js package and bignumber.js library.

While most JSON parsers assume numeric values have same precision restrictions as IEEE 754 double, JSON specification does not say anything about number precision. Any floating point number in decimal (optionally scientific) notation is valid JSON value. It's a good idea to serialize values which might fall out of IEEE 754 integer precision as strings in your JSON api, but { "value" : 9223372036854775807}, for example, is still a valid RFC4627 JSON string, and in most JS runtimes the result of JSON.parse is this object: { value: 9223372036854776000 }

Options

The behaviour of the parser is somewhat configurable through 'options'

options.strict, boolean, default false

Specifies the parsing should be "strict" towards reporting duplicate-keys in the parsed string.
The default follows what is allowed in standard json and resembles the behavior of JSON.parse, but overwrites any previous values with the last one assigned to the duplicate-key.

Setting options.strict = true will fail-fast on such duplicate-key occurances and thus warn you upfront of possible lost information.

example:

var JSONbig =require('json-bigint');

var JSONstrict =require('json-bigint')({"strict":true});

var dupkeys ='{ "dupkey": "value 1", "dupkey": "value 2"}';

console.log('\n\nDuplicate Key test with both lenient and strict JSON parsing');

options.storeAsString, boolean, default false

Specifies if BigInts should be stored in the object as a string, rather than the default BigNumber.

Note that this is a dangerous behavior as it breaks the default functionality of being able to convert back-and-forth without data type changes (as this will convert all BigInts to be-and-stay strings).

example:

var JSONbig =require('json-bigint');

var JSONbigString =require('json-bigint')({"storeAsString":true});

var key ='{ "key": 1234567890123456789 }';

console.log('\n\nStoring the BigInt as a string, instead of a BigNumber');