2013-08-12 110 views
0

JavaScript對象,我都存儲在數據屬性的JSON字符串。解析JSON字符串與函數名

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

而且我有哪些命名dMethod功能:

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

當我嘗試通過JSON.parse我得到一個錯誤說無效字符來解析字符串。我檢查和dMethod是定義何時解析方法運行,如果我刪除,「總是」:dMethod部分,然後解析器工作正常。 我不能在dMethod周圍使用引號,因爲那樣這個類型將是字符串類型而不是對象函數。
任何幫助,將不勝感激。
謝謝,
Péter
編輯:
謝謝你的所有答案。我做了一些澄清,所以也許你會更好地理解問題。我做一個非常簡單的JS庫,使jQueryUI的無礙:

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); 
    }); 
    } 
}); 

我不得不JSON.parse和eval之間選擇。但我認爲eval不會是那麼好的選擇。儘量保持「圖書館」儘可能簡單。但它看起來像我已經備件的小部件的代碼。

回答

1

功能在JSON有效的數據類型(見http://en.wikipedia.org/wiki/JSON#Data_types.2C_syntax_and_example)。

我認爲你必須反序列化作爲一個字符串,然後後處理的對象,並設置「總是」你的方法。

+0

感謝。我做了som的進步,但卡住了一些JavaScript魔術。我做了另一個問題(儘量不要垃圾郵件這個)如果你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; 
});