我有一个网站,它返回类似JSON的数据结构:
{
"name":"tom jones",
"no": 123,
"storedproc": function(){
callbuyer(0123);
}
}
我使用带有dataType“JSON”的$.ajax()
获取此数据。不幸的是,我的$.ajax()
调用了错误回调,因为我的数据包含一个函数()。
我该如何正确解析?我真的需要将函数存储在变量中并稍后调用它。
答案 0 :(得分:7)
这只是不合法的JSON(正如您所知道的那样)See the offical JSON syntax。关于真正的JSON的好处是可以使用JSON.parse
安全地包装eval
调用。
虽然可以使用eval
,但我建议您重新访问应用程序的体系结构,并找到其他方法来执行您要执行的操作。
特别是,我希望服务器只返回0123
,并让你的客户端保持逻辑,让它知道,在某些情况下,哪些函数适用(在这里的情况,函数将是{ {1}})。
这应该有效,因为你说你想要稍后调用callbuyer
的值的函数。由于此函数的主体包含对storedproc
的调用,因此客户端脚本知道callbuyer
是什么。诀窍是你的服务器不要发送任意的,不受约束的函数,而是发送客户端可以利用它对整个应用程序的知识以某种方式利用的数据。
答案 1 :(得分:4)
你能安排让服务器像这样返回JSON:
{"name":"tom jones",
"no": 123,
"storeprocFn": callbuyer,
"arg": "0123"};
然后你的回调函数可以调用callbuyer
函数并传递arg
答案 2 :(得分:1)
使用eval将字符串解释为javascript对象。但是,您将无法使用JSON数据类型。我相信你需要做的是使用'text'作为$ .ajax调用的dataType。然后做一些事情:
var data = eval('(' + text + ')');
应该有效。当然,eval是邪恶的。但它会解决你的问题。只要你能保证文本中没有任何恶意内容(没有未经过无限制,用户输入的数据)那么你应该没问题。
答案 3 :(得分:1)
AFAIK,使用JSON.stringify
时遗漏了函数,它并不意味着用于克隆完整对象(道具和方法)。但是,您可以将函数体作为字符串传递。
假设您决定使用func=>var foo = 'bar'; return foo;
之类的字符串格式。这应该作为常规JSON字符串传递,在解析对象后,您可以迭代所有属性,并将这些字符串转换为如下函数:
for (var prop in parsedObj)
{
if (parsedObj.hasOwnProperty(prop) && parsedObj[prop].match(/^func\=\>/))
{
parsedObj[prop] = new Function(parsedObj[prop].replace('func=>',''));
}
}
尽管如此,我认为你可能想重新考虑一下你的方法,但这不是JSON的用途。在确保它们不包含有害代码之后,所有JSON字符串都被评估,这是不安全的。这种方法正在创造一个漏洞/漏洞,JSON人员努力工作以封锁。
答案 4 :(得分:0)
对于您的示例,这将有效: 'user.storeproc = function(){callbuyer(user.no);};'
Var'user'是解析的json的对象。
Ps:也许你必须格式化user.no,从123到0123
答案 5 :(得分:0)
遵循JSON扩展,“JFON”,传输函数和数组属性
JFON使用eval,用于以下情况:
1)您的数据来自可靠来源(例如,不是来自用户输入或来自您自己服务器的代码),以及
2)你知道“eval”的背景下没有不良的副作用
(它是函数“fromJFON”,第127行)中的eval的上下文
3)重构你的应用程序以使用“无功能”JSON是很昂贵的;
4)JFON是一天工作,因此可能需要更多测试;
这个想法:使用选定的属性名来转义函数和数组,如
在字符串中,当选择字符“\”用于传递\ n和\为自己。
在JFON中,选择名称“wrap”来传递函数及其自身:“wrap”:{“fun”:...和“wrap”:{“esc”:...
演示:http://landkey.org/Sandbox/z/spaceen86/js/btb/tests/jfon.htm
代码(使用commit 0.0.86):
https://github.com/lancelab/spaceen/blob/master/js/btb/JFON.js
测试:github.com/lancelab/spaceen/blob/master/js/btb/tests/jfon.htm
这是另一个“JWON”扩展:JSON-comments,这里 - 文档,JSON的猴子修补:
github.com/lancelab/Boardspirator/blob/master/diary/play/tp/jwon.js