网站的 JSON 响应的一部分有这个(...为上下文添加):
{..., now:function(){return(new Date).getTime()}, ...}
向 JSON 添加匿名函数是否有效?我希望每次您访问“时间”时都会返回不同的值。
网站的 JSON 响应的一部分有这个(...为上下文添加):
{..., now:function(){return(new Date).getTime()}, ...}
向 JSON 添加匿名函数是否有效?我希望每次您访问“时间”时都会返回不同的值。
不。
JSON 纯粹是一种数据描述语言。如http://www.json.org所述,它是一种“轻量级数据交换格式”。- 不是编程语言。
根据http://en.wikipedia.org/wiki/JSON,支持的“基本类型”是:
null
问题在于 JSON 作为一种数据定义语言是从 JSON 作为一种 JavaScript 对象表示法演变而来的。由于 Javascript 支持 JSON 上的 eval,因此将 JSON 代码放入 JSON(在该用例中)是合法的。如果您使用 JSON 远程传递数据,那么我会说将方法放在 JSON 中是不好的做法,因为您可能没有很好地建模您的客户端-服务器交互。此外,当希望使用 JSON 作为数据描述语言时,我会说嵌入方法可能会给自己带来麻烦,因为某些 JSON 解析器在编写时只考虑了数据描述,并且可能不支持结构中的方法定义。
Wikipedia JSON 条目很好地说明了在 JSON 中不包括方法,理由是安全问题:
除非您绝对信任文本的来源,并且您需要解析和接受不严格符合 JSON 的文本,否则您应该避免使用 eval() 并改用 JSON.parse() 或其他 JSON 特定解析器。JSON 解析器将仅识别 JSON 文本并拒绝其他可能包含恶意 JavaScript 的文本。在提供原生 JSON 支持的浏览器中,JSON 解析器也比 eval 快得多。预计原生 JSON 支持将包含在下一个 ECMAScript 标准中。
让我们引用其中一个规范 - https://www.rfc-editor.org/rfc/rfc7159#section-12
JavaScript 对象表示法(JSON) 数据交换格式规范指出:
JSON 是 JavaScript 的子集,但不包括赋值和调用。
由于 JSON 的语法是从 JavaScript 借来的,因此可以使用该语言的“eval()”函数来解析 JSON 文本。这通常构成不可接受的安全风险,因为文本
可能包含可执行代码以及数据声明。同样的考虑适用于在 JSON 文本符合该
语言语法的任何其他编程语言中使用类似 eval() 的函数。
因此,所有声明哪些函数不属于 JSON 标准的答案都是正确的。
官方的回答是:不,在 JSON 结果中定义函数是无效的!
答案可能是肯定的,因为“代码就是数据”和“数据就是代码”。即使 JSON 被用作与语言无关的数据序列化格式,通过其他类型的“代码”隧道也将起作用。
JSON 字符串可用于将 JS 函数传递给客户端浏览器以供执行。
[{"data":[["1","2"],["3","4"]],"aFunction":"function(){return \"foo bar\";}"}]
这导致了类似的问题:如何“https://stackoverflow.com/questions/939326/execute-javascript-code-stored-as-a-string”。
准备好,举起你的“eval() 是邪恶的”标志,并在它旁边贴上你的“不要通过 JSON 隧道函数”标志。
据我所知,这不是标准的。快速浏览一下http://json.org/可以确认这一点。
JSON 明确排除了函数,因为它并不意味着仅是 JavaScript 数据结构(尽管名称中有 JS)。
不,绝对不是。
如果你使用一个像样的 JSON 序列化器,它不会让你序列化这样的函数。这是一个有效的 OBJECT,但不是有效的 JSON。无论该网站的意图是什么,它都不会发送有效的 JSON。
一个简短的回答是不...
JSON 是一种完全独立于语言的文本格式,但使用 C 系列语言(包括 C、C++、C#、Java、JavaScript、Perl、Python 等)的程序员熟悉的约定。这些属性使 JSON 成为一种理想的数据交换语言。
看看原因:
在浏览器和服务器之间交换数据时,数据只能是文本。
JSON 是文本,我们可以将任何 JavaScript 对象转换为 JSON,并将 JSON 发送到服务器。
我们还可以将从服务器接收到的任何 JSON 转换为 JavaScript 对象。
通过这种方式,我们可以将数据作为 JavaScript 对象进行处理,而无需复杂的解析和翻译。
但是等等...
仍然有存储函数的方法,不建议这样做,但仍有可能:
我们说过,你可以保存一个string
......那么将你的函数转换为字符串怎么样?
const data = {func: '()=>"a FUNC"'};
然后你可以使用字符串化数据JSON.stringify(data)
,然后使用JSON.parse
来解析它(如果需要这一步)......
并eval执行字符串函数(在此之前,请让您知道广泛不推荐使用 eval):
eval(data.func)(); //return "a FUNC"
通过使用 NodeJS(commonJS 语法),我能够使这种类型的功能正常工作,我最初在一些外部 JS 文件中只有一个 JSON 结构,但我希望该结构更像是一个类,其方法可以在运行。
不需要在 myJSON 中声明 'Executor'。
var myJSON = {
"Hello": "World",
"Executor": ""
}
module.exports = {
init: () => { return { ...myJSON, "Executor": (first, last) => { return first + last } } }
}
JSON 中的函数表达式是完全可以的,只是不要忘记用双引号括起来。下面是一个取自 noSQL 数据库设计的示例:
{
"_id": "_design/testdb",
"views": {
"byName": {
"map": "function(doc){if(doc.name){emit(doc.name,doc.code)}}"
}
}
}
虽然不推荐使用 eval ,但这有效:
<!DOCTYPE html>
<html>
<body>
<h2>Convert a string written in JSON format, into a JavaScript function.</h2>
<p id="demo"></p>
<script>
function test(val){return val + " it's OK;}
var someVar = "yup";
var myObj = { "func": "test(someVar);" };
document.getElementById("demo").innerHTML = eval(myObj.func);
</script>
</body>
</html>
把引号去掉...
var a = {"b":function(){alert('hello world');} };
a.b();