我有一个存储在数据属性中的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不会是那么好的选择。并尽量保持“库”尽可能简单。但看起来我已经在小部件上备用了代码。
答案 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;
});