2010-12-14 9 views
7

javascript/jquery의 문자열을 함수로 변환하려면 어떻게해야합니까?JSON 문자열을 자바 스크립트의 함수로 변환하려면 어떻게해야합니까?

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 
}) 
+0

감사합니다 - JSON이 데이터 전용이라는 것을 알고 있습니다 ... 변경 매개 변수 목록을 사용하여 jqGrid 객체를 초기화하려고하는데 간혹 한 매개 변수를 사용합니다 ... 그리고이 경우에는 함수 자체적으로 내부 데이터를 변경하기 때문에 생성하고 문자열로 전송 한 다음 내 라이브러리에서 정의하고 별도로 초기화하는 것이 더 쉽습니다. –

답변

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 라이브러리를로드해야합니다. 난 당신이 평가의 위험을 인식하고 가정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'); 

:

예 :

또는 두 개의 별도 evals을한다.

+0

감사합니다 - 잘 작동합니다. jquery의 $(). getJSON()에서 json을 얻습니다.이 jQuery는 평가없이 파싱합니다. –

+0

감사합니다 - 잘 작동합니다. 나는 종종 평가가 악하다고 들었다. 그러나 나는 왜 그런지 정말로 모른다. JSON.parse() 및 jquery의 $ .parseJson()은 함수를 평가하지 않는 것 같습니다. 그래서 eval()을 사용해야합니다. 그러나 누군가가 이것을 남용하고 싶다면 jquery가 $ .getJSON() 호출에서 구문 분석 된 객체를 반환하므로 특정 매개 변수를 알아야합니다. –

+0

@ Adam : 평가 대상 콘텐츠를 완전히 제어 할 수 있다는 것을 알고 있다면 괜찮습니다. 그것은 자바 스크립트의 문자열 표현을 실행하기 때문에 누군가가 악성 코드를 전달할 가능성이 있다면 사용하면 안됩니다. – 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()을 사용하고 있습니다. 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

고맙습니다 - 이걸 보았습니다 ... 함수에 대해 별도의 변수를 정의하는 것보다 훨씬 깔끔합니다. –

관련 문제