【问题标题】:Can an array be top-level JSON-text?数组可以是顶级 JSON 文本吗?
【发布时间】:2011-04-19 11:57:13
【问题描述】:

根据这篇文章中的辩论:json-conversion-in-javascript

【问题讨论】:

    标签: arrays json rfc4627


    【解决方案1】:

    是的,数组作为顶级 JSON 文本是合法的。

    定义 JSON 的标准文档有四个:RFC 4627RFC 7159(已废弃 RFC 4627)、ECMA-404RFC 8259(已废弃 RFC 7159,并调用 ECMA-404 规范)。它们在允许的顶级元素上有所不同,但都允许将对象或数组作为顶级元素。

    • RFC 4627:对象或数组。
      “JSON 文本是序列化的对象或数组。”
    • RFC 7159、RFC8259:任何 JSON 值。
      “JSON 文本是序列化值。请注意,某些先前的 JSON 规范将 JSON 文本限制为对象或数组。 " Section 2
    • ECMA-404:任何 JSON 值。
      “JSON 文本是由符合 JSON 值的 Unicode 代码点形成的标记序列 语法。”

    【讨论】:

    • 截至this newer RFC,“JSON 文本是一系列标记。标记集包括六个结构字符、字符串、数字和三个文字名称。”
    • @antak 这个问题是什么意思?
    • @OrestesKappa 该评论是对答案而非问题的评论,但它的精神现在反映在此答案的当前修订版中。简而言之:较新的 RFC 不将 JSON 文本限制为对象或数组,并且允许任何序列化值。
    【解决方案2】:

    是的,但由于JSON hijacking,您应该考虑在某些情况下将根设为对象。这是一个基于在JavaScript中重写数组构造函数的信息泄露漏洞。

    【讨论】:

    • 是的,这是一个很好的答案的标志 - 不仅告诉 OP 他们想知道什么,而且告诉他们应该知道什么(但没有意识到)。实际上,有一堆与 JSON 相关的漏洞被解析为 Javascript,JSON 劫持只是一个例子。
    【解决方案3】:

    这是来自 ECMAScript 规范。

    JSON文本: JSON值 JSON值: JSONNullLiteral JSONBooleanLiteral JSON对象 JSON数组 JSON字符串 JSON数字

    【讨论】:

    • 这有点误导,因为 ECMAScript 允许您解析不是顶级文本的 JSON 字符串。根据 RFC,“JSON 文本是一个序列化的对象或数组。”
    • @Matthew - 很奇怪,我想知道 Crockford 对此有何感受。他们将如何协调 RFC 和 ECMA 之间的差异?
    • 我只是看了看,发现他们意识到了不同之处。从 ECMAScript 5 §15.12 开始,“ECMAScript JSON 语法的顶级 JSONText 生成可能包含任何 JSONValue,而不是被限制为 RFC 4627 指定的 JSONObject 或 JSONArray。”我不知道 IETF 是否会改变 RFC。
    • @Matthew - 谢谢你,我感到非常困惑。 json.org 的描述根本没有提到“json-text”这个限制性更强的概念,而且 RFC 对它的意义也有些模糊。
    • 这个答案是关于 ECMAScript,但问题是关于 JSON。虽然它们(故意)看起来相似,但它们是不同的规格
    【解决方案4】:

    是的,你可以做到。输入[{}]

    【讨论】:

    • 比这更容易。输入[],它将验证。
    【解决方案5】:

    在其他 cmets 中可以看到一些混乱。根据JSON RFC,“application/json”媒体类型仅允许 JSON 文本的顶层对象或数组。但是,对于解析器,任何 JSON 值都是可接受的,如 ECMAScript 规范中所见。

    更新:RFC 4627 已过时。新的 RFC 也允许顶层的简单值。 (谢谢, Matthias Dieter Wallnöfer。)

    【讨论】:

    • 任何作为顶级元素的 JSON 值对于 ECMAScript 解析器 都是可接受的,但对于(兼容的)JSON 解析器 则不可接受 - 重要区别.
    • 这是一个有趣的区别,但我不明白你在说什么。 “(兼容的)JSON 解析器”的定义是什么?
    • 嗯,JSON 解析器是 JSON 语法的解析器。虽然 JSON 看起来类似于 Javascript,但它是一种不同的(更简单的)语法。请参阅描述 JSON 语法的 tools.ietf.org/html/rfc7159。 “兼容”只是意味着解析器实际上遵循语法(任何体面的解析器都应该这样做)。
    • RFC 4627 已过时,请不要再遵循它。新的 RFC 还允许顶层的简单值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 2022-07-09
    相关资源
    最近更新 更多