2013-08-12 2 views
0

데이터 속성에 JSON 문자열이 저장되어 있습니다.함수 이름이 JSON 문자열에서 JavaScript 객체로 구문 분석

{ 
    "active": true, 
    "icons": { 
     "activeHeader": "ui-icon-alert" 
    }, 
    "animate": { 
     "duration": 1000, 
     "always": dMethod 
    } 
} 

은 내가 dMethod라는 기능이 있습니다

function dMethod() { 
    alert("DONE"); 
} 

내가 오류가 잘못된 문자 말했다 얻을 JSON.parse를 통해 문자열을 구문 분석하려고

. 확인하고 dMethod는 구문 분석 메서드가 실행될 때 정의되며 "항상"제거하면 : dMethod 파트 다음 파서가 올바르게 작동합니다. dMethod에서 인용 부호를 사용할 수 없습니다. 유형이 객체 함수 대신 문자열 유형이 될 것이기 때문입니다.
도움이 될 것입니다.
감사합니다,
페테르
편집 : 모든 답변
감사합니다 당신. 나는 그 문제를 더 잘 이해할 수 있도록 약간의 설명을한다. 나는 정말 간단 JS 라이브러리 jqueryui이 unobstructive 할 수 있도록 : 나는 JSON.parse과 평가 사이의 선택에 있었다

var juiObjects = ["accordion", "autocomplete", "button", "datepicker", "dialog", "menu", "progressbar", "slider", "spinner", "tabs", "tooltip"]; 

$(document).ready(function() { 
    for (var i = 0; i < juiObjects.length; i++) { 
    var attributeName = "data-" + juiObjects[i]; 
    $("["+ attributeName + "]").each(function() { 
     var optionsValue = $(this).attr(attributeName); 
     var options = JSON.parse(optionsValue); 
     $(this)[juiObjects[i]](options); 
    }); 
    } 
}); 

. 하지만 eval은 그렇게 좋은 선택이 아니라고 생각합니다. 그리고 "도서관"을 가능한 한 간단하게 유지하십시오. 그러나 위젯을 따라 코드를 여유롭게 만든 것 같습니다.

답변

1

함수가 JSON에서 유효한 데이터 유형이 아닙니다 (http://en.wikipedia.org/wiki/JSON#Data_types.2C_syntax_and_example 참조).

문자열로 비 직렬화 한 다음 개체를 사후 처리하고 메서드에 "항상"설정해야한다고 생각합니다.

+0

감사합니다. 나는 som 진보했지만 일부 자바 스크립트 마술에 붙어. 나는 또 하나의 질문을했다. (스팸 메일이 아니다.) intrested : http://stackoverflow.com/questions/18189367/javascript-deep-search-and-change-in-object –

1

[] 구문을 사용하여 윈도우 오브젝트의 기능을 실행함으로써, dMethod 인용에 의해 수행 될 수

function dMethod() { 
    alert("DONE"); 
} 

var json = '{"active":true,"icons":{"activeHeader":"ui-icon-alert"},"animate":{"duration":1000,"always":"dMethod"}}'; // quoted 

var obj = JSON.parse(json); 
window[obj.animate.always](); 
1

JSON.parse 유효한 JSON 문자열을 기대하고있다. 따라서 이것을 사용하려면 dMethod 함수를 인용해야합니다. 구문 분석 후에 "dMethod"문자열을 실제 함수로 바꿀 수는 없습니까?

1

유효한 JSON이 아니기 때문에 해당 문자열을 JSON으로 구문 분석 할 수 없습니다.

eval 함수를 사용하여 문자열을 개체로 변환 할 수 있지만 물론 동적으로 실행하는 것에 대한 일반적인 경고가 적용됩니다. 문자열에있는 내용을 완전히 제어 할 수없는 경우 크로스 사이트 스크립팅에 사용할 수 있습니다.

var obj = eval(json); 
obj.always(); 
0

이 그 기능과 객체를 직렬화하는 방법은 다음과 같습니다

JSON.stringify(YOUR_OBJECT, function (key, value) { 
     if (typeof value === 'function') { 
      return value.toString(); 
     } 
     return value; 
    }); 

을이 그것을 다시 역 직렬화하는 방법입니다 :

JSON.parse(YOUR_JSON_STRING, function (key, value) { 
    if (value 
     && typeof value === "string" 
     && value.substr(0,8) == "function") { 
     var startBody = value.indexOf('{') + 1; 
     var endBody = value.lastIndexOf('}'); 
     var startArgs = value.indexOf('(') + 1; 
     var endArgs = value.indexOf(')'); 

     return new Function(value.substring(startArgs, endArgs) 
          , value.substring(startBody, endBody)); 
    } 
    return value; 
}); 
관련 문제