将JSON字符串解析为具有函数名称的JavaScript对象

时间:2013-08-12 10:22:57

标签: javascript json

我有一个存储在数据属性中的JSON字符串。

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

我有一个名为dMethod的函数:

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

当我尝试通过JSON.parse解析字符串时,我收到一个错误,表示无效字符。我检查并在解析方法运行时定义了dMethod,如果我删除了“always”:dMethod部分,则解析器正常工作。 我不能在dMethod周围使用引号,因为那时类型将是字符串类型而不是对象函数 任何帮助将不胜感激 谢谢,
彼得
编辑:
谢谢你的所有答案。我做了一些澄清,所以也许你能更好地理解这个问题。我创建了一个非常简单的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不会是那么好的选择。并尽量保持“库”尽可能简单。但看起来我已经在小部件上备用了代码。

5 个答案:

答案 0 :(得分: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 :(得分:1)

JSON.parse 需要有效的JSON字符串。所以,如果你想使用它,你应该引用dMethod函数。解析后是不是可以用真实函数替换字符串“dMethod”。

答案 2 :(得分:1)

函数不是JSON中的有效数据类型(请参阅http://en.wikipedia.org/wiki/JSON#Data_types.2C_syntax_and_example)。

我认为您必须将其反序列化为字符串,然后对您的对象进行后处理并将“始终”设置为您的方法。

答案 3 :(得分:1)

您无法将该字符串解析为JSON,因为它不是有效的JSON。

您可以通过使用eval函数执行它来将字符串转换为对象,但当然通常会有关于执行任何动态的警告。如果您无法完全控制字符串中的内容,则可以使用跨站点脚本。

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

答案 4 :(得分: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;
 });