1

我有一个存储在数据属性中的 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 不会是那么好的选择。并尽量保持“图书馆”尽可能简单。但看起来我已经在小部件中节省了代码。

4

5 回答 5

1

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

于 2013-08-12T10:30:52.620 回答
1

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

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

于 2013-08-12T10:31:10.597 回答
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]();
于 2013-08-12T10:28:15.640 回答
1

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

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

var obj = eval(json);
obj.always();
于 2013-08-12T10:37:28.800 回答
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;
 });
于 2016-07-27T22:46:47.603 回答