2013-08-12 107 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; 
});