2010-12-14 16 views
7

javascript/jqueryの文字列を関数に変換するにはどうすればよいですか?JSON文字列をJavaScriptの関数に変換するにはどうすればよいですか?

JSONパラメータリストを使用して関数を初期化しようとしています。しかし、パラメータの1つは関数であり、これを文字列として格納し、関数を返すためにeval()を使用しようとするとエラーが発生します。

例えば、私のJSONがある場合:私のコードで次に

json = { "one": 700, "two": "function(e){alert(e);}" } 

parameters = eval(json); 
$('myDiv').addThisFeature({ 
parameter_1: json.one, 
parameter_2: eval(json.two) // <= generates error 
}) 
+0

ありがとうございます - 私はJSONがデータのみであることを知っています...私はjqGridオブジェクトを変更するパラメータリストで初期化しようとしていますが、時には1つのパラメータを関数を使用して...そしてこの場合、それ自体が内部データを変更しているので、それを生成して文字列として送信し、それをライブラリで定義し、別々に初期化する方が簡単です。 –

答えて

7

例:http://jsfiddle.net/patrick_dw/vs83H/

var json = '{ "one": 700, "two": "function(e){alert(e);}" }'; 
var parameters = JSON.parse(json); 
eval('var func = ' + parameters.two); 
func('test'); // alerts "test" 

あなたはそれをサポートしていないブラウザでJSONライブラリをロードする必要があります。私はあなたがevalのの危険性を認識していると仮定しhttp://jsfiddle.net/patrick_dw/vs83H/1/

var json = '{ "one": 700, "two": "function(e){alert(e);}" }'; 
eval('var parameters = ' + json); 
eval('var func = ' + parameters.two); 
func('test'); 

例:

それとも、2つの別々の試用版を実行します。

+0

ありがとう - 素晴らしい作品。 jqueryの$()。getJSON()は、evalなしで解析します。 –

+0

ありがとう - それは素晴らしい作品です。私はしばしばevalが悪であると聞いてきましたが、なぜ私は本当にその理由がわかりません。 JSON.parse()とjqueryの$ .parseJson()は関数を評価していないようです - eval()を使う必要があるようです。しかし、誰かがこれを悪用しようとすると、jqueryが$ .getJSON()呼び出しから解析されたオブジェクトを返すので、特定のパラメータを知る必要があります。 –

+0

@Adam:あなたが評価されているコンテンツを完全に制御できることが分かっているなら、あなたは大丈夫です。それはあなたがそれを与えるjavascriptの任意の文字列表現を実行するだけであるので、誰かが何らかの悪質なコードを渡す可能性があるなら、それは使用すべきではありません。 – user113716

0

が、これは私が思い付くことが最高ですevalを使用しないでへの道を探して。関数コンストラクターを使用して、stringからfunctionを作成します。

var parsed = JSON.parse('{"one":"700", "two":"function(){return 0;}" }'); 
var func = new Function('return ' + parsed.two)(); // return parsed.two function 
alert(typeof func); // function 
alert(func()) // 0 
+0

コメントを削除したいと思っています:) – Phrogz

+0

JSONオブジェクトがすべてのブラウザに存在しません。 IE7以前はそれがありません – mkoryak

0

this SO questionを参照してください。前述のように、JSONはデータを保持するためのものです。データの一部を関数として扱うには、最初に文字列を評価する必要があります。

0

あなたは無名関数を評価していますが、もちろん何も呼び出されません。 jsonでコードを実行したければ、テキストはalert(e)である必要があります。

しかし、それは非常に賢明なようには聞こえません。 jsonオブジェクトに埋め込まれたコードを実行しようとするのではなく、jsonオブジェクトの内容を処理するコードを記述する方がよいでしょう。

0

どちらの方法も特にいいですが、関数(e)ラッパービットを取り除くことができる場合は、var myDynamicFunction = new Function("e", "alert(e);");を使用できます。それ以外の場合はeval()を使用しています。​​は一般的に悪です。これが$.getJSONコールなどから戻ってきたJSONの場合は、セキュリティ上の懸念から開放されています。

1

この使用します。文字列の先頭と末尾に括弧を追加

parameters = eval('(' + json + ')'); 
$('#myDiv').addThisFeature({ 
parameter_1: parameters.one, 
parameter_2: eval('(' + parameters.two + ')') // <= does not generate an error 
}); 

は、構文エラーを防ぐことができます。

しかし、evalを使用してJSONを解析していることに注意してください(場合によってはセキュリティ上のリスクがありますが、サーバーから送信された任意のコードを実行する必要があるため無関係です)。サーバー側の柔軟性(無効なJSONを送信する)がある場合は、にして文字列として返すだけで、evalはそれを正しく解析できるはずです。

+0

ありがとう - ちょうどこれを見た...それは関数のための別の変数を定義するよりもはるかにクリーンです。 –

関連する問題