将JSON字符串解析为具有函数名的JavaScript对象
我在数据属性中存储了一个JSON字符串将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
{
"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魔术。我问了另一个问题,如果你感兴趣的话,试着不要发垃圾邮件: