在JSON结果中定义函数是否有效?

时间:2010-01-04 19:02:24

标签: json anonymous-function

网站的JSON响应的一部分有这个(...为上下文添加):

{..., now:function(){return(new Date).getTime()}, ...}

向JSON添加匿名函数是否有效?我希望你每次访问“时间”都能返回不同的值。

11 个答案:

答案 0 :(得分:97)

没有

JSON纯粹是一种数据描述语言。如http://www.json.org所述,它是一种“轻量级数据交换格式”。 - 不是编程语言。

http://en.wikipedia.org/wiki/JSON,支持的“基本类型”是:

  • 数字(整数,实数或浮点数 点)
  • String(双引号Unicode 反斜杠逃避)
  • 布尔 (真假)
  • 数组(有序 值序列,逗号分隔 并附在方括号内)
  • 对象(键的集合:值 对,逗号分隔和封闭 (花括号)
  • 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();