[解決済み] 循環構造をJSONのような形式で印刷するにはどうすればよいですか?
2022-03-20 06:47:51
質問
大きなオブジェクトがあり、JSONに変換して送信したいのですが、どうすればよいですか?しかし、それは循環構造を持っています。循環参照が存在するものはすべて捨てて、文字列化できるものはすべて送信したい。どうしたらいいでしょうか?
ありがとうございます。
var obj = {
a: "foo",
b: obj
}
objを文字列化したい。
{"a":"foo"}
解決方法は?
使用方法
JSON.stringify
をカスタムリプレースで使用します。例えば
// Demo: Circular reference
var circ = {};
circ.circ = circ;
// Note: cache should not be re-used by repeated calls to JSON.stringify.
var cache = [];
JSON.stringify(circ, (key, value) => {
if (typeof value === 'object' && value !== null) {
// Duplicate reference found, discard key
if (cache.includes(value)) return;
// Store value in our collection
cache.push(value);
}
return value;
});
cache = null; // Enable garbage collection
この例のレプリケーターは100%正しいわけではありません("duplicate"の定義によります)。次のような場合、値は破棄されます。
var a = {b:1}
var o = {};
o.one = a;
o.two = a;
// one and two point to the same object, but two is discarded:
JSON.stringify(o, ...);
しかし、コンセプトは同じです。カスタムリプレイサーを使用し、パースされたオブジェクトの値を追跡します。
es6で書かれたユーティリティ関数として。
// safely handles circular references
JSON.safeStringify = (obj, indent = 2) => {
let cache = [];
const retVal = JSON.stringify(
obj,
(key, value) =>
typeof value === "object" && value !== null
? cache.includes(value)
? undefined // Duplicate reference found, discard key
: cache.push(value) && value // Store value in our collection
: value,
indent
);
cache = null;
return retVal;
};
// Example:
console.log('options', JSON.safeStringify(options))
関連
-
[解決済み】SyntaxError: JSONの位置1に予期しないトークンoがある。
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JSONでコメントを使用することはできますか?
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] JavaScriptでJSONをきれいに印刷する
-
[解決済み] JavaScriptの日付の書式設定方法
-
[解決済み] Microsoft JSONの日付はどのようにフォーマットするのですか?
-
[解決済み] オブジェクトの配列から、プロパティの値を配列として取り出す。
-
[解決済み] 正しい」JSONの日付形式とは?
-
[解決済み] JSONオブジェクトをTypeScriptのクラスにキャストする方法を教えてください。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
vueにおけるv-forループオブジェクトのプロパティ
-
[解決済み】ローカルファイルを開くことができません - Chrome: ローカルリソースの読み込みが許可されていない
-
[解決済み] 配列の結合時に未定義のプロパティ 'push' を読み込むことができない
-
[解決済み】awaitは非同期関数でのみ有効です。
-
[解決済み】Node.js Error: Cannot find module express
-
[解決済み] 期待される代入または関数呼び出し: 未使用式なし ReactJS
-
[解決済み] 周期的なオブジェクト値を含むオブジェクトのシリアライズ
-
OSSアップロードエラーを解決する: net::ERR_SSL_PROTOCOL_ERROR
-
[解決済み] JavaScriptのオブジェクトを表示するにはどうすればよいですか?
-
[解決済み] Chromeのsendrequestエラーです。TypeError: 循環構造をJSONに変換中