TypeError: cyclic object value

JavaScript の例外 "cyclic object value" は、 JSON の中にオブジェクトの参照が見つかったときに発生します。 JSON.stringify() はこれを解決しようとせず、これによって失敗します。

メッセージ

TypeError: cyclic object value (Firefox)
TypeError: Converting circular structure to JSON (Chrome and Opera)
TypeError: Circular reference in value argument not supported (Edge)

エラーの種類

エラーの原因

JSON 形式はオブジェクト参照に対応していません (IETF の草案はありますが)。したがって JSON.stringify() はこれを解決しようとせず、これによって失敗します。

循環参照

次のような循環構造体では、

js
var circularReference = { otherData: 123 };
circularReference.myself = circularReference;

JSON.stringify() は失敗します。

js
JSON.stringify(circularReference);
// TypeError: cyclic object value

循環参照をシリアライズするには、それに対応したライブラリ (例えば cycle.js) を使用したり、自分自身で循環参照を探してシリアライズ可能な値に置き換える (または削除する) ことを求める解決策を実装することもできます。

次のスニペットは、 JSON.stringify()replacer 引数を使用して循環参照を検索してフィルタリングする方法を示しています (これによりデータ損失が発生します)。

js
const getCircularReplacer = () => {
  const seen = new WeakSet();
  return (key, value) => {
    if (typeof value === "object" && value !== null) {
      if (seen.has(value)) {
        return;
      }
      seen.add(value);
    }
    return value;
  };
};

JSON.stringify(circularReference, getCircularReplacer());
// {"otherData":123}

関連情報

  • JSON.stringify
  • cycle.jsJSON.decycleJSON.retrocycle という 2 つの関数を導入し、循環構造と dag を JSON でエンコードしてからリカバリーできます。