包含函数的JSON
JSON that contains functions
我有一个网站,它返回类似JSON的数据结构,如下所示:
{
"name":"tom jones",
"no": 123,
"storedproc": function(){
callbuyer(0123);
}
}
我使用数据类型为"JSON"的$.ajax()
获取这些数据。不幸的是,我的$.ajax()
调用了错误回调,因为我的数据包含一个函数()。如何正确解析?我真的需要将函数存储在一个变量中,然后再调用它。
这只是而不是合法的JSON(正如您所知,给出了问题的标题)请参阅官方JSON语法。真正的JSON的好处是可以使用JSON.parse
来安全地封装eval
调用。
虽然可以使用eval
,但我建议重新访问应用程序的体系结构,并找到其他方法来完成您正在尝试的操作。
特别是,我会让服务器只返回0123
,并让您的客户端保留逻辑,以便在某些情况下知道应用了哪些函数(在这里的场景中,函数将是callbuyer
)。
这应该会起作用,因为您说稍后要调用storedproc
的值函数。由于该函数的主体包含对callbuyer
的调用,因此客户端脚本知道callbuyer
是什么。诀窍是,服务器不要发送任意的、不受约束的函数,而是发送客户端可以利用其对整个应用程序的了解以某种方式利用的数据。
你能安排让服务器返回这样的JSON吗:
{"name":"tom jones",
"no": 123,
"storeprocFn": callbuyer,
"arg": "0123"};
然后,回调函数可以调用callbuyer
函数并传递arg
使用eval将字符串解释为javascript对象。但是,您将无法使用JSON数据类型。我认为您需要做的是使用"text"作为$.ajax调用的dataType。然后做一些类似的事情:
var data = eval('(' + text + ')');
应该有效。当然,eval是邪恶的。但这会解决你的问题。只要你能保证文本中没有任何恶意内容(没有未初始化的、用户输入的数据),那么你就应该没事了。
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人员努力将其封闭。
对于您的示例,这将起作用:'user.storeproc=function(){callbuyer(user.no);};'
Var"user"是解析的json的对象。
Ps:也许你必须格式化user.no,从123到0123
遵循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注释、Here文档、JSON的猴子补丁:
github.com/lancelab/Boardspirator/blob/master/diary/play/tp/jwon.js
- jQuery $.get() JSON 函数正在执行,但不会产生任何结果
- ajax get-json函数没有'不起作用
- 如何通过ajax将JSON函数作为数据传递和检索到PHP
- 如何从json函数访问javascript中的基类变量
- jquery 每个 JSON 函数
- 从日期对象减去一天的 JSON 函数
- 解析C#中的JSON函数
- 在Json函数的基础上返回javascript函数的值
- Postgres JSON函数传递了字符串而不是对象
- json函数在vs 2010中没有执行
- 如何在display中显示数据:来自.json函数的表
- Jquery json函数不能正常工作
- 我如何从(init) JSON函数调用(ko.observableArray)
- 如何使用json函数填充数据库组合框
- 返回Json函数没有更新我的下拉列表
- 正确调用JSON函数
- 如何修复引号ajax json?(函数正确把)
- 为什么我的for循环不工作在我的JSON函数
- 动态JSON函数
- 使用jQuery JSON函数填充文本区域时,一个特定的下拉菜单项被选中