5

循環参照を含むオブジェクトがあり、そのJSON表現を確認したいと思います。たとえば、このオブジェクトを作成すると、次のようになります。

var myObject = {member:{}};
myObject.member.child = {};
myObject.member.child.parent = myObject.member;

と電話してみてください

JSON.stringify(myObject);

当然のことながら、「再帰が多すぎます」というエラーが表示されます。「子」オブジェクトにはその「親」への参照があり、親にはその子への参照があります。JSON表現は完全に正確である必要はありません。これは、データをサーバーに送信したり、オブジェクトをファイルにシリアル化したりするためではなく、デバッグにのみ使用しているためです。parentJSON.stringifyに特定のプロパティ(この場合は子オブジェクトのプロパティ)を無視するように指示する方法はありますか?

{
    "member" : {
        "child" : {}
    }
}

JSON.stringifyは関数であるすべてのプロパティを無視するため、私が考えることができる最も近い方法は、メンバーだけでなくメソッドを使用することgetChild()ですgetParent()が、必要がない場合はそうしません。

4

2 に答える 2

8

stringifyの2番目の引数として関数を渡すことができます。この関数は、文字列化するメンバーのキーと値を引数として受け取ります。この関数がundefinedを返す場合、メンバーは無視されます。

alert(JSON.stringify(myObject, function(k, v) {
    return (k === 'member') ? undefined : v;
}));

...または、オブジェクト内の内容のみを確認したい場合は、たとえばfirebugを使用するか、toSource()メソッドを使用します。

alert(myObject.toSource());
于 2010-10-09T02:34:10.233 に答える
6

crockford の実装( ECMA 仕様に準拠) から:

stringify メソッドは、toJSON メソッドを含むオブジェクトを検出すると、そのメソッドを呼び出し、返された値を文字列化します。これにより、オブジェクトは独自の JSON 表現を決定できます。

次に、次のようなものがうまく機能するはずです。

var myObject =
{
    member: { child: {} }
}
myObject.member.child.parent = myObject.member;
myObject.member.child.toJSON = function ()
{
    return 'no more recursion for you.';
};

console.log(JSON.stringify(myObject));​

http://jsfiddle.net/feUtk/

于 2010-10-09T02:35:28.070 に答える