Spec-Zone.ru › JavaScript

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)

Тип ошибки

TypeError

Что пошло не так?

Вы пытаетесь сериализовать значение 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}'
    

Смотрите также

  • BigInt
  • JSON.stringify()
  • JSON.rawJSON()

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API