2011-09-01 8 views
1

私はFirefox拡張機能を開発中です。JSONオブジェクトを文字列化しようとしています。JSONはメソッドを除外したオブジェクトを文字列化します

私はこのstringify functionを使用していますが、私はこのエラーを取得しています:

Could not convert JavaScript argument "NS_ERROR_XPC_BAD_CONVERT_JS"

私は実際には最初のレベルまたは2またはオブジェクトの内部プロパティを気に、私は気にしませんメソッド/関数。もしこれをすべて必要としないなら、オブジェクトを文字列化する簡単な方法はありますか?

ここで私が使用しているコードのビットです:

var s=JSONstring.make('abc'); 

    try{ 

     Firebug.Console.log(gContextMenu); 

     s = JSON.stringify(gContextMenu); 

     Firebug.Console.log(s); 
    }catch(e){ 
     Firebug.Console.log('error'); 
     Firebug.Console.log(e); 
    } 
    var s=JSONstring.make('abc'); 
    Firebug.Console.log(s); 
    Firebug.Console.log(gContextMenu); 

をここでは、コンソールウィンドウにエラーです:

image http://img845.imageshack.us/img845/5554/picture1npb.png

これは私が外にコピーすることができたものですFirebugコンソールウィンドウ:

http://pastebin.com/KPXceRag

ここでは、オブジェクトのスクリーンショットです:

image http://img143.imageshack.us/img143/2603/pictureos.png

+0

文字列化するサンプル文字列を入力してください。ありがとう。 –

+0

オブジェクトは何とか自分自身を参照していますか? – ChaosPandion

+0

@ChaosPandion - おそらく、はい。しかし、私が使用した関数は再帰に対処することになっていました。私はコピーして貼り付けただけなので、おそらく調整が必要なのかもしれません。私はJSONを推測しています.stringifyはそれを処理しません、またはそれは常に利用可能ではありませんか? – cwd

答えて

1

あなたがしたいオブジェクトの要素だけを返すtoJSON()と呼ばれるあなたのオブジェクトにカスタム関数を定義することができます。やや直感的に、あなたのtoJSON関数はでなければなりません。は、JSON文字列を返します。JSON.stringifyの入力として何を使うべきかを表すオブジェクトを返します。例えば

// an object with some attributes you want and some you don't 
var o = { 
    a:"value1", 
    b:"value2", 
    doCalc: function() { return this.a + " " + this.b } 
}; 
// define a custom toJSON() method 
o.toJSON = function() { 
    return { 
     a:this.a, 
     calc: this.doCalc() 
    } 
}; 

JSON.stringify(o); // '{"a":"value","calc":"value1 value2"}' 

あなたの場合、あなたはJSON.stringifyを呼び出す前に、その場でgContextMenuために、このメソッドを定義することができるはずです。これには、あなたが望むものとしたくないものを明示的に定義する必要がありますが、よりよい方法はないと思います。

編集:あなたはすべての非法の値を引くしたい場合、あなたはこのような何かを試みることができる

o.toJSON = function() { 
    var attrs = {}; 
    for (var attr in this) { 
     if (typeof this[attr] != "function") { 
      attrs[attr] = String(this[attr]); // force to string 
     } 
    } 
    return attrs; 
}; 

はおそらく"[object Object]"に設定いくつかの属性で終わるであろうが、すべてのあなたの場合これは問題ではないでしょう。これらのタイプの属性だけを取得したい場合は、typeof this[attr] == "string" || typeof this[attr] == "number"をチェックすることもできます。

+1

ループを追加してメソッドを返すことはできますが、メソッドを返すことはできません。または、おそらくすべてのプロパティは文字列ですか?私はどのアイテムが存在するのかわからず、すべてのアイテムをつかむようにしていました。 – cwd

+0

ありがとう! – cwd

関連する問題