代码之家  ›  专栏  ›  技术社区  ›  Zachary Scott

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

  •  93
  • Zachary Scott  · 技术社区  · 15 年前

    网站的JSON响应中有一部分是这样的(…为上下文添加):

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

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

    10 回复  |  直到 6 年前
        1
  •  96
  •   Community CDub    9 年前

    不。

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

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

    • 数字(整数、实数或浮点数 点)
    • 字符串(双引号Unicode 带反斜杠转义)
    • 布尔 (对与错)
    • 数组(有序的 值序列,逗号分隔 用方括号括起来)
    • 对象(键集合:值 成对,逗号分隔和封闭 大括号)
    • null
        2
  •  16
  •   harschware    15 年前

    问题在于,JSON作为一种数据定义语言,从JSON演变为一种JavaScript对象表示法。因为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标准中。

        3
  •  7
  •   jldupont    15 年前

    据我所知,这是不标准的。快速查看 http://json.org/ 证实了这一点。

        4
  •  7
  •   Community CDub    7 年前

    让我们引用一个规格- http://tools.ietf.org/html/rfc7159#section-12

    这个 javascript对象表示法(JSON)数据交换格式规范 国家:

    JSON是JavaScript的一个子集,但不包括赋值和调用。

    由于JSON的语法是从JavaScript中借用的,因此可以 使用该语言的“eval()”函数解析JSON文本。这个 通常构成 不可接受的安全风险,因为文本
    可以包含可执行代码和数据声明
    . 相同的 注意事项适用于在任何 JSON文本符合的其他编程语言
    语言的语法。

    所以,所有关于函数不属于JSON标准的回答都是正确的。

    官方答案是: 不,在JSON结果中定义函数是无效的!


    答案可能是肯定的,因为“代码就是数据”和“数据就是代码”。 即使JSON被用作独立于语言的数据序列化格式,通过其他类型的“代码”隧道也可以工作。

    可以使用JSON字符串将JS函数传递给客户端浏览器以供执行。

    [{"data":[["1","2"],["3","4"]],"aFunction":"function(){return \"foo bar\";}"}]
    

    这就引出了这样一个问题:如何 Execute JavaScript code stored as a string “。

    准备好,升起“eval()is evil”标记,并将“不要通过json隧道函数”标记贴在它旁边。

        5
  •  4
  •   Jerod Venema    15 年前

    不,绝对不是。

    如果您使用一个合适的JSON序列化程序,它不会让您序列化这样的函数。它是有效的对象,但不是有效的JSON。不管那个网站的意图是什么,它都不会发送有效的JSON。

        6
  •  3
  •   Tatu Ulmanen    15 年前

    JSON显式地排除了函数,因为它不应该是仅限javascript的数据 结构(尽管名称中有JS)。

        7
  •  2
  •   Alireza    7 年前

    简短的回答是

    JSON是一种完全独立于语言但使用 C系列程序员熟悉的约定 语言,包括C语言、C++语言、C语言、Java语言、JavaScript语言、Perl语言、Python语言和Python语言。 许多其他。这些属性使JSON成为理想的数据交换 语言。

    看看原因:

    在浏览器和服务器之间交换数据时,数据只能 是文本。

    json是文本,我们可以将任何javascript对象转换为json,并且 将JSON发送到服务器。

    我们还可以将从服务器接收到的任何JSON转换为JavaScript。 物体。

    这样我们就可以将数据作为javascript对象来使用,而不需要 复杂的解析和翻译。

    但是 等待

    还有很多方法可以存储你的功能 未推荐的 但仍有可能:

    我们说,你可以 string …那么把函数转换成字符串怎么样?

    const data = {func: '()=>"a FUNC"'};
    

    然后可以使用 JSON.stringify(data) 然后使用 JSON.parse 要分析它(如果需要此步骤)…

    埃瓦 要执行字符串函数(在执行此操作之前,请告知您广泛不建议使用eval):

    eval(data.func)(); //return "a FUNC"
    
        8
  •  -1
  •   pascati    6 年前

    尽管不建议使用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>
    
        9
  •  -2
  •   John Slegers    9 年前

    不要引用…

    var a = {"b":function(){alert('hello world');} };
    
    a.b();
    
        10
  •  -2
  •   Eimantas Pėlikis    8 年前

    JSON中的函数表达式是完全可能的,只是不要忘记用双引号括起来。以下是从NoSQL数据库设计中获取的示例:

    {
      "_id": "_design/testdb",
      "views": {
        "byName": {
          "map": "function(doc){if(doc.name){emit(doc.name,doc.code)}}"
        }
      }
    }