网站的JSON响应的一部分有这个(...为上下文添加):
{..., now:function(){return(new Date).getTime()}, ...}
向JSON添加匿名函数是否有效?我希望你每次访问“时间”都能返回不同的值。
答案 0 :(得分:97)
没有
JSON纯粹是一种数据描述语言。如http://www.json.org所述,它是一种“轻量级数据交换格式”。 - 不是编程语言。
每http://en.wikipedia.org/wiki/JSON,支持的“基本类型”是:
null
答案 1 :(得分:16)
问题是JSON作为数据定义语言是从JSON演变为JavaScript Object Notation。由于Javascript支持在JSON上使用eval,因此将JSON代码放在JSON中是合法的(在该用例中)。如果您使用JSON远程传递数据,那么我会说将方法放在JSON中是不好的做法,因为您可能没有很好地建模您的客户端 - 服务器交互。而且,当我希望使用JSON作为数据描述语言时,我会说你可能会因嵌入方法而陷入麻烦,因为一些JSON解析器只是考虑了数据描述,可能不支持结构中的方法定义。
Wikipedia JSON entry提出了一个很好的理由,即不包括JSON中的方法,引用安全问题:
除非您完全信任文本的来源,并且您需要解析并接受不严格遵循JSON的文本,否则应避免使用eval()并使用JSON.parse()或其他JSON特定解析器。 JSON解析器将仅识别JSON文本,并将拒绝其他可能包含恶意JavaScript的文本。在提供本机JSON支持的浏览器中,JSON解析器也比eval快得多。预计本机JSON支持将包含在下一个ECMAScript标准中。
答案 2 :(得分:7)
据我所知,这不是标准。快速查看http://json.org/就可以证实这一点。
答案 3 :(得分:7)
让我们引用其中一个规范 - http://tools.ietf.org/html/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\";}"}]
这引出了一个问题:如何“Execute JavaScript code stored as a string”。
做好准备,提高你的“eval()是邪恶的”旗帜并坚持你的“不通过JSON隧道功能”标志旁边。
答案 4 :(得分:4)
不,绝对不是。
如果你使用一个体面的JSON序列化程序,它将不允许你序列化这样的函数。它是一个有效的OBJECT,但不是有效的JSON。无论该网站的意图是什么,它都不会发送有效的JSON。
答案 5 :(得分:3)
JSON明确排除了函数,因为它不是一个仅限JavaScript的数据 结构(尽管名称中包含JS)。
答案 6 :(得分:2)
简短的回答是否 ......
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"
答案 7 :(得分:0)
通过使用NodeJS(commonJS语法),我能够使这种类型的功能正常工作,我最初在某些外部JS文件中只有一个JSON结构,但是我希望该结构更像是一个Class,其方法可以在运行时确定。
不需要在myJSON中声明“ Executor”。
var myJSON = {
"Hello": "World",
"Executor": ""
}
module.exports = {
init: () => { return { ...myJSON, "Executor": (first, last) => { return first + last } } }
}
答案 8 :(得分:-2)
尽管不建议使用eval,但这可以起作用:
applicationId
答案 9 :(得分:-3)
JSON中的函数表达式是完全可能的,只是不要忘记用双引号将其包装起来。以下是从noSQL数据库设计中获取的示例:
{
"_id": "_design/testdb",
"views": {
"byName": {
"map": "function(doc){if(doc.name){emit(doc.name,doc.code)}}"
}
}
}
答案 10 :(得分:-4)
关闭引号......
var a = {"b":function(){alert('hello world');} };
a.b();