从网站的JSON响应中,这部分内容是这样的(...是为了方便上下文而添加的):
{..., now:function(){return(new Date).getTime()}, ...}
将匿名函数添加到JSON中是否有效? 我期望每次访问'time'时返回不同的值。
从网站的JSON响应中,这部分内容是这样的(...是为了方便上下文而添加的):
{..., now:function(){return(new Date).getTime()}, ...}
将匿名函数添加到JSON中是否有效? 我期望每次访问'time'时返回不同的值。
不。
JSON是一种纯粹用于数据描述的语言。正如http://www.json.org所指出的,它是一个“轻量级数据交换格式”,而非编程语言。
根据http://en.wikipedia.org/wiki/JSON,支持的“基本类型”包括:
null
a==null?1:a.toString()==""
。这样做的意思是,如果a=null,则返回1/true,如果它是"",也就是空字符串,你也会得到1/true。如果它既不是null也不是"",那么它将返回0/false,你可以通过在我的上一个片段中添加?1:a==[]?1:a.toString()=={}.toString();
来复制更多内容以处理[]和{}。所以也许这个函数会帮助你。isnull=(function(a){return (a==null?1:a.toString()==""?1:a==[]?1:a.toString()=={}.toString())?true:false})
我会使用?1:0
而不是?true:false
,但(true/false)。 - JamesM-SiteGen让我们引用规范中的一段 - https://www.rfc-editor.org/rfc/rfc7159#section-12
JavaScript对象表示法(JSON)数据交换格式规范 表示:
JSON是JavaScript的一个子集,但排除了赋值和调用。
由于JSON的语法借鉴了JavaScript,因此可以使用该语言的“eval()”函数解析JSON文本。这通常构成了一个不可接受的安全风险,因为文本可能包含可执行代码以及数据声明。相同的考虑也适用于在任何其他编程语言中使用类似eval()的函数,其中JSON文本符合该语言的语法。
因此,所有声称函数不是JSON标准一部分的答案都是正确的。
官方答案是:不,定义JSON结果中的函数无效!
答案可能是肯定的,因为“代码是数据”和“数据就是代码”。即使将JSON用作独立于语言的数据序列化格式,通过其他类型的“隧道”传递“代码”也可以工作。
JSON字符串可能被用来传递JS函数给客户端浏览器执行。
[{"data":[["1","2"],["3","4"]],"aFunction":"function(){return \"foo bar\";}"}]
这导致了类似于以下问题的提出:如何执行存储为字符串的JavaScript代码。
准备好,升起您的“eval()是邪恶的”旗帜,并将您的“不要通过JSON隧道函数”旗帜贴在旁边。
不是的,绝对不是这样。
如果你使用一个良好的JSON序列化程序,它不会让你像那样序列化一个函数。它是一个有效的对象,但不是有效的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"
JSON明确排除函数,因为它不仅仅是JavaScript数据结构(尽管名称中有JS)。
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>
JSON.parse('{now:function(){return(new Date).getTime()}')
。检查器会显示:Uncaught SyntaxError: Unexpected token n
。 快速查看 [JSON 规范](http://www.json.org/)可以确认这一点。重点关注“value”部分。 - Mark E. Haase