Encoding and decoding JavaScript BigInt values with reviver
Updated on August 13, 2021
JSON.parse()
accepts a second parameter: a reviver()
function.
It is a function that can be used to transform the JSON
values as they’re
being parsed.
As it turns out, when combined with JavaScript’s BigInt
type, you can parse
and encode JavaScript BigInt
numbers via JSON:
I chose to interpret strings that contains only numbers and an ending n
suffix
as BigInt
values, similar to how JavaScript interprets 123
(a number)
differently from 123n
(a bigint
);
We do those checks before constructing the BigInt
to avoid throwing needless
exceptions and catching them on the parsing function, as this could easily
become a bottleneck when parsing large JSON values.
In order to do the full roundtrip, we now only need the toJSON()
counterpart:
With both bigIntReviver
and toJSON
defined, we can now successfully parse
and encode JavaScript objects with BigInt
values transparently:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const s = `[
null,
true,
false,
-1,
3.14,
"a string",
{ "a-number": "-123" },
{ "a-bigint": "-123n" }
]`;
const parsed = JSON.parse(s, bigIntReviver);
const s2 = JSON.stringify(parsed);
console.log(parsed);
console.log(s2);
console.log(typeof parsed[6]["a-number"])
console.log(typeof parsed[7]["a-bigint"])
The output of the above is:
If you’re on a web browser, you can probably try copying and pasting the above code on the console right now, as is.
Even though JSON
doesn’t include BigInt
number, encoding and decoding them
as strings is quite trivial on JavaScript.