Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将JSON字符串解析为具有函数名的JavaScript对象_Javascript_Json - Fatal编程技术网

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

将JSON字符串解析为具有函数名的JavaScript对象,javascript,json,Javascript,Json,我在数据属性中存储了一个JSON字符串 { "active": true, "icons": { "activeHeader": "ui-icon-alert" }, "animate": { "duration": 1000, "always": dMethod } } 我有一个名为dMethod的函数: function dMethod() { alert("DONE"); } 当我试图通过JS

我在数据属性中存储了一个JSON字符串

{
    "active": true,
    "icons": {
        "activeHeader": "ui-icon-alert"
    },
    "animate": {
        "duration": 1000,
        "always": dMethod
    }
}
我有一个名为dMethod的函数:

function dMethod() {
  alert("DONE");
} 
当我试图通过JSON.parse解析字符串时,我得到一个错误,称为无效字符。我检查并在解析方法运行时定义了dMethod,如果我删除了,always:dMethod部分,那么解析器工作正常。 我不能在dMethod周围使用引号,因为这样类型将是string类型而不是object函数。 任何帮助都将不胜感激。 谢谢 佩特尔 编辑: 谢谢你的回答。我做了一些澄清,也许你能更好地理解这个问题。我制作了一个非常简单的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不是个好选择。并尽量使库尽可能简单。但是看起来我已经在小部件中省去了代码。

可以引用dMethod,使用[]语法在窗口对象上执行函数:


可以引用dMethod,使用[]语法在窗口对象上执行函数:


JSON.parse需要一个有效的JSON字符串。因此,如果您想使用它,您应该引用dMethod函数。解析后是否可以用实函数替换字符串dMethod。

JSON.parse需要一个有效的JSON字符串。因此,如果您想使用它,您应该引用dMethod函数。解析后是否可以用实函数替换字符串dMethod。

函数在JSON中不是有效的数据类型请参阅


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

函数在JSON中不是有效的数据类型请参见


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

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

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

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

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

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

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

以下是如何序列化对象及其函数:

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

以下是如何序列化对象及其函数:

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

谢谢我取得了som进展,但仍坚持使用一些javascript魔术。我问了另外一个问题,如果你感兴趣的话,尽量不要发垃圾邮件:谢谢。我取得了som进展,但仍坚持使用一些javascript魔术。我问了另一个问题,如果你感兴趣的话,试着不要发垃圾邮件: