包含函数的JSON

JSON that contains functions

本文关键字:JSON 函数 包含      更新时间:2023-11-14

我有一个网站,它返回类似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