Hacker News new | ask | show | jobs
by sheept 5 days ago
You can serialize a BigInt by specifying a replacer:

    const obj = { a: 9007199254740993n }
    JSON.stringify(obj, (_key, value) => typeof value === 'bigint' ? JSON.rawJSON(value.toString()) : value)
1 comments

And then you end up with strings on the other side, not numbers.
No you don't? The example I gave produces

    {"a":9007199254740993}
not

    {"a":"9007199254740993"}
Oh, that's much worse! The JSON string `{"a":9007199254740993}` decodes to the object `{"a":9007199254740992}` with typical JSON parsers like JavaScript's `JSON.parse`.
If you're applying a replacer, then you'd supply a reviver when parsing:

    const json = '{ "a": 9007199254740993 }'
    JSON.parse(json, (_key, value, context) => /^\d+$/.test(context.source) ? BigInt(context.source) : value)
Yeah but now you have the world's biggest foot gun in your API.