4

我有一个网站,它返回类似 JSON 的数据结构,如下所示:

{
    "name":"tom jones",
    "no": 123,
     "storedproc": function(){
                      callbuyer(0123);
                    }
}

我正在使用$.ajax()数据类型“JSON”获取这些数据。不幸的是,我$.ajax()调用了错误回调,因为我的数据包含一个函数()。我怎样才能正确解析这个?我真的需要将函数存储在一个变量中,然后再调用它。

4

6 回答 6

7

这根本不是合法的 JSON(正如你所知道的问题的标题)请参阅官方 JSON 语法。真正的 JSON 的好处是可以使用JSON.parse它来安全地包装eval调用。

虽然eval可以使用,但我建议重新审视您的应用程序的架构并找到其他方法来做您想做的事情。

特别是,我会让服务器返回0123唯一的,并让您的客户端保留让它知道在某些情况下应用哪些函数的逻辑(在此处的场景中,该函数将是callbuyer)。

这应该有效,因为您说您要调用后者的值的函数storedproc。由于此函数的主体包含对其的调用,callbuyer因此您的客户端脚本知道它是什么callbuyer。诀窍是让你的服务器不要发回任意的、不受约束的函数,而是你的客户端可以利用它对整个应用程序的了解以某种方式利用的数据。

于 2012-07-19T07:52:25.693 回答
4

你能安排让服务器像这样返回 JSON:

{"name":"tom jones",
  "no": 123,
 "storeprocFn": callbuyer,
 "arg": "0123"};

然后你的回调函数可以调用该callbuyer函数并通过arg

于 2012-07-19T07:58:04.507 回答
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 人们努力封堵。

于 2012-07-19T08:04:17.643 回答
1

使用eval将字符串解释为 javascript 对象。但是,您将无法使用 JSON 数据类型。我相信您需要做的是使用“文本”作为 $.ajax 调用的数据类型。然后执行以下操作:

var data = eval('(' + text + ')');

应该管用。当然,eval 是邪恶的。但它会解决你的问题。只要您可以保证文本中没有任何恶意内容(没有未经处理的用户输入数据),那么您应该没问题。

于 2012-07-19T07:48:28.593 回答
0

在 JSON 扩展之后,“JFON”会传输函数和数组属性。
JFON 使用 eval 并适用于以下情况:

1)您的数据来自受信任的来源(例如不是来自用户输入或来自您自己的服务器的代码),并且
2)您知道“eval”上下文没有不良副作用
(它是 eval 的上下文在函数“fromJFON”中,第 127 行)
3)重构您的应用程序以使用“无功能”JSON 的成本很高;
4) JFON 是一天的工作,所以可能需要更多的测试;

想法:使用选定的属性名称来逃避函数和数组,例如
在选定字符“ \”时在字符串中进行\ n和\本身。

在 JFON 中,选择名称 "wrap" 来传递函数及其本身: "wrap" : { "fun" : ... 和 "wrap" : { "esc" : ...

演示: http: //landkey.org/Sandbox/z/spaceen86/js/btb/tests/jfon.htm

代码(使用提交 0.0.86):
https
://github.com/lancelab/spaceen/blob/master/js/btb/JFON.js 测试:github.com/lancelab/spaceen/blob/master/js/btb/测试/jfon.htm

这是另一个“JWON”扩展:JSON-comments、here-documents、monkey-patching of JSON:
github.com/lancelab/Boardspirator/blob/master/diary/play/tp/jwon.js

于 2013-10-18T18:31:26.310 回答
0

对于您的示例,这将起作用:'user.storeproc = function() { callbuyer(user.no);};'

Var 'user' 是解析后的 json 的对象。

ps:可能你要格式化user.no,从123到0123

于 2012-07-19T07:58:45.553 回答