簡體   English   中英

如何在Javascript中將JSON字符串轉換為函數?

[英]How do I convert a JSON string to a function in javascript?

如何將javascript / jquery中的字符串轉換為函數?

我正在嘗試使用JSON參數列表來初始化函數。 但是,其中一個參數是一個函數,我將其存儲為字符串,當我嘗試使用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
})

示例: 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庫。

或者做兩個單獨的逃避:

示例: 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' );

我假設你已經意識到了eval的危險性。

用這個:

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

在字符串的開頭和結尾添加括號可防止語法錯誤。

但請注意,您正在使用eval解析JSON(在某些情況下存在安全風險,但我認為這是無關緊要的,因為您確實希望運行服務器發送的任意代碼)。 如果你有服務器端的靈活性(發送無效的JSON),你可以發送沒有引用的函數作為字符串, eval應該能夠解析那個就好了。

尋找一種不使用eval的方法,這是我能想到的最好的方法。 使用Function構造functionstring創建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

看到這個問題 如前所述,JSON旨在保存數據。 要將一段數據視為一個函數,首先需要評估該字符串。

你正在評估一個匿名函數,當然不會被任何東西調用。 如果你真的想在json中運行代碼,那么文本需要alert(e)

然而,這聽起來不是一件非常明智的事情。 你最好編寫代碼來處理json對象的內容,而不是試圖運行嵌入在json中的代碼。

這兩種方式都不是特別好,但如果你可以擺脫函數(e)包裝位,那么你可以使用var myDynamicFunction = new Function("e", "alert(e);"); 否則,您正在考慮使用eval() Eval()一般都是邪惡的。 如果這是你從$.getJSON調用回來的JSON,你就會$.getJSON安全問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM