在JSON结果中定义函数是否有效?
部分网站的JSON响应有(…添加上下文):
{..., now:function(){return(new Date).getTime()}, ...}
是添加匿名函数到JSON有效吗? 我希望你每次访问“时间”返回一个不同的值。
没有。
JSON纯粹是一种数据描述语言。 如http://www.json.org所述; ,这是一种“轻量级数据交换格式”。 – 不是一种编程语言。
根据http://en.wikipedia.org/wiki/JSON ,支持的“基本types”是:
- 数字(整数,实数或浮点数)
- string(带双斜杠的双引号Unicode)
- 布尔(true和false)
- 数组(一个有序的值序列,用逗号分隔,并用方括号括起来)
- 对象(key:value对的集合,用逗号分隔并用大括号括起来)
-
null
问题是作为数据定义语言的JSON是作为JavaScript Object Notation从JSON演化而来的。 由于JavaScript支持JSON的eval,因此将JSON代码放入JSON(在这种情况下)是合法的。 如果您使用JSON来远程传递数据,那么我认为将方法放在JSON中是不好的做法,因为您可能没有很好地模拟客户端与服务器的交互。 此外,当希望使用JSON作为数据描述语言时,我会说你可能会因为embedded方法而陷入麻烦,因为一些JSONparsing器只是用数据描述来编写,并且可能不支持结构中的方法定义。
维基百科JSON条目是一个不包括JSON方法的好例子,引用了安全问题:
除非您绝对相信文本的来源,并且您需要parsing和接受不严格符合JSON的文本,否则应该避免使用eval()并使用JSON.parse()或其他特定于JSON的parsing器。 JSONparsing器将只识别JSON文本,并将拒绝其他可能包含恶意JavaScript的文本。 在提供原生JSON支持的浏览器中,JSONparsing器也比eval更快。 预计下一个ECMAScript标准将包含本机JSON支持。
据我所知,这不是标准的。 快速浏览http://json.org/确认这一点。;
我们引用其中一个规范 – http://tools.ietf.org/html/rfc7159#section-12
JavaScript对象表示法(JSON)数据交换格式规范指出:
JSON是JavaScript的一个子集,但不包括赋值和调用。
由于JSON的语法是从JavaScript中借用的,因此可以使用该语言的“eval()”函数来parsingJSON文本。 自文本以来,这通常构成不可接受的安全风险
可能包含可执行代码和数据声明 。 同样的考虑适用于在任何其他编程语言中使用类似eval()的函数,其中JSON文本符合这一点
语言的语法。
因此,所有说明这些函数不属于JSON标准的答案都是正确的。
官方的答案是: 不,在JSON结果中定义函数是无效的!
答案可能是肯定的,因为“代码是数据”和“数据是代码”。 即使JSON被用作独立于语言的数据序列化格式,通过其他types的“代码”的隧道也将起作用。
可以使用JSONstring将JS函数传递给客户端浏览器执行。
[{"data":[["1","2"],["3","4"]],"aFunction":"function(){return \"foo bar\";}"}]
这导致问题如:如何“ 执行存储为一个string的JavaScript代码 ”。
做好准备,提高你的“eval()是邪恶的”国旗,并坚持你的“不通过JSON隧道function”的标志旁边。
不,绝对不是。
如果你使用一个体面的JSON序列化器,它不会让你序列化一个这样的function。 这是一个有效的对象,但不是有效的JSON。 无论这个网站的意图是什么,它都不会发送有效的JSON。
JSON明确地排除了函数,因为它不是一个纯JavaScript的数据结构(尽pipe名字中有JS)。
把引号留下来…
var a = {"b":function(){alert('hello world');} }; ab();
JSON中的函数expression式是完全可能的,只是不要忘记用双引号包装它。 下面是从noSQL数据库devise中取得的一个例子:
{ "_id": "_design/testdb", "views": { "byName": { "map": "function(doc){if(doc.name){emit(doc.name,doc.code)}}" } } }