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

Zac*_*ott 97 json anonymous-function

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

{..., now:function(){return(new Date).getTime()}, ...}
Run Code Online (Sandbox Code Playgroud)

向JSON添加匿名函数是否有效?我希望每次你访问"时间"返回一个不同的值.

Mik*_*ike 102

没有.

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

根据http://en.wikipedia.org/wiki/JSON,支持的"基本类型"是:

  • 数字(整数,实数或浮点数)
  • 字符串(带反斜杠转义的双引号Unicode)
  • 布尔值(true和false)
  • 数组(有序的值序列,逗号分隔并用方括号括起来)
  • 对象(键的集合:值对,逗号分隔并用花括号括起来)
  • null

  • 同时,功能也是数据. (10认同)
  • @RavindranathAkila REST意味着可能在调用中公开可能的下一个API调用.换句话说:您所做的REST请求,告诉您可能要做的未来请求(基于应用程序决策逻辑和数据).一个完美的例子是Github API,其中返回了数据元素 - 但其中一些导致了其他API请求资源. (3认同)
  • @Dr.Zim,no和比较的东西为null我做的是这个`a == null?1:a.toString()==""`这样做是说如果a = null那么它返回1/true,如果它是""意味着空字符串你也得到1 /真..如果它不是null或""然后它将返回0/false,你可以复制这更多与[]和{}只是添加`? 1:a == []?1:a.toString()== {}.toString();`到我的prev片段.也许这个功能可以帮到你.`isnull =(function(a){return(a == null?1:a.toString()==""?1:a == []?1:a.toString()== {}.toString( ))?true:false})`我会使用`?1:0`而不是`?true:false`但是(true/false) (2认同)
  • 我找到了一种使用JSON获取"更多数据"的方法.通知客户端(从服务器)如​​何获取更多数据会很好,而客户不必担心接下来要调用哪个REST或者api. (2认同)

har*_*are 16

问题是JSON作为数据定义语言是从JSON演变为JavaScript Object Notation.由于Javascript支持在JSON上使用eval,因此将JSON代码放在JSON中是合法的(在该用例中).如果您使用JSON远程传递数据,那么我会说将方法放在JSON中是不好的做法,因为您可能没有很好地建模您的客户端 - 服务器交互.而且,当我希望使用JSON作为数据描述语言时,我会说你可能会因为嵌入方法而陷入麻烦,因为一些JSON解析器只是考虑了数据描述,并且可能不支持结构中的方法定义.

维基百科JSON条目为不包括JSON中的方法提供了一个很好的理由,引用了安全性问题:

除非您完全信任文本的来源,并且您需要解析和接受不严格遵循JSON的文本,否则应该避免使用eval()并使用JSON.parse()或其他JSON特定的解析器.JSON解析器将仅识别JSON文本,并将拒绝其他可能包含恶意JavaScript的文本.在提供本机JSON支持的浏览器中,JSON解析器也比eval快得多.预计本机JSON支持将包含在下一个ECMAScript标准中.

  • 您可能会通俗地使用术语JSON,但是正式地,“ JSON”是ECMA标准,并不包含要编码的功能对象。当您说“ JSON”时,您应该指的是哪些功能,这就是拥有标准的“重点”。 (2认同)

Jen*_*och 8

让我们引用其中一个规范 - 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\";}"}]
Run Code Online (Sandbox Code Playgroud)

这引出了一个问题:如何" 执行存储为字符串的JavaScript代码 ".

做好准备,提高你的"eval()是邪恶的"旗帜并坚持你的"不通过JSON隧道功能"标志旁边.


jld*_*ont 7

据我所知,这不是标准.快速浏览http://json.org/就可以确认这一点.


jve*_*ema 5

不,绝对不是。

如果你使用一个像样的 JSON 序列化器,它不会让你序列化这样的函数。它是有效的 OBJECT,但不是有效的 JSON。无论该网站的意图是什么,它都不会发送有效的 JSON。

  • 我使用 JSON-Lib 并认为它是一个很棒的序列化器。从[使用页面](json-lib.sourceforge.net/usage.html)你可以看到它可以很好地序列化函数 (2认同)