TypeError: Значение BigInt не может быть сериализовано в JSON
Исключение JavaScript "BigInt value can't be serialized in JSON" возникает, когда встречается BigInt в JSON.stringify без предоставления пользовательского метода сериализации.
Сообщение
TypeError: Do not know how to serialize a BigInt (V8-based) TypeError: BigInt value can't be serialized in JSON (Firefox) TypeError: JSON.stringify cannot serialize BigInt. (Safari)
Тип ошибки
Что пошло не так?
Вы пытаетесь сериализовать значение BigInt с помощью JSON.stringify, который по умолчанию не поддерживает значения BigInt. Иногда преобразование в строку JSON (JSON stringification) происходит неявно в библиотеках, как часть сериализации данных. Например, отправка данных на сервер, их хранение во внешнем хранилище или передача между потоками — всё это требует сериализации, которая часто выполняется с использованием JSON.
Есть несколько способов справиться с этим:
- Если вы можете изменить источник данных, избегайте использования значений BigInt и сначала приведите их к числу (что может привести к потере точности для больших чисел).
- Если вы можете изменить процесс преобразования в строку, передайте функцию-заменитель (replacer) в
JSON.stringify, которая преобразует значения BigInt в строки или числа. - Вы также можете предоставить метод
BigInt.prototype.toJSONглобально, который будет вызываться всякий раз, когда значение BigInt преобразуется в строку.
Для получения дополнительной информации о различных компромиссах см. справочник BigInt.
Примеры
Предоставление пользовательского метода сериализации
По умолчанию значения BigInt не сериализуются в JSON:
const data = { a: 1n };
JSON.stringify(data);
// TypeError: BigInt value can't be serialized in JSON
Предполагая, что вы хотите, чтобы JSON содержал числовое значение, вот несколько работающих подходов:
-
Преобразуйте BigInt в число перед преобразованием в строку:
const data = { a: 1n }; JSON.stringify({ ...data, a: Number(data.a) }); // '{"a":1}' -
Предоставьте функцию-заменитель (replacer), которая преобразует значения BigInt в числа или сырые объекты JSON:
const data = { a: 1n }; JSON.stringify(data, (key, value) => typeof value === "bigint" ? Number(value) : value, ); // '{"a":1}'const data = { a: 1n }; JSON.stringify(data, (key, value) => typeof value === "bigint" ? JSON.rawJSON(value.toString()) : value, ); // '{"a":1}' -
Предоставьте метод
BigInt.prototype.toJSON, который вызывается всякий раз, когда значение BigInt преобразуется в строку:BigInt.prototype.toJSON = function () { return Number(this); }; const data = { a: 1n }; JSON.stringify(data); // '{"a":1}'BigInt.prototype.toJSON = function () { return JSON.rawJSON(this.toString()); }; const data = { a: 1n }; JSON.stringify(data); // '{"a":1}'
Смотрите также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/BigInt_not_serializable