数组可以是顶级JSON文本吗?


Answers:


126

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

有三个定义JSON的标准文档:RFC 4627RFC 7159(已淘汰RFC 4627)和ECMA-404。它们在允许使用的顶级元素方面有所不同,但是都允许将对象或数组作为顶级元素。

  • RFC 4627:对象或数组。
    “ JSON文本是序列化的对象或数组。”
  • RFC 7159:任何JSON值。
    “ JSON文本是序列化的值。”
  • ECMA-404:任何JSON值。
    “ JSON文本是由符合JSON值语法的Unicode代码点形成的令牌序列。”

2
这个更新的RFC开始,“ JSON文本是令牌序列。令牌集包括六个结构字符,字符串,数字和三个文字名称。”
安塔克

63

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


11
是的,这是一个很好的答案的标志-不​​仅告诉OP他们想知道什么,而且告诉他们应该知道(但没有意识到)。实际上,与JSON相关的大量漏洞可以解析为Javascript,JSON劫持只是一个例子。
sleske '16


4

这来自ECMAScript规范。

JSONText:
    JSONValue

JSONValue:
    JSONNullLiteral 
    JSONBooleanLiteral 
    JSONObject 
    JSONArray 
    JSONString 
    JSONNumber

1
但是,这有点误导,因为ECMAScript允许您解析不是顶级文本的JSON字符串。根据RFC,“ JSON文本是序列化的对象或数组。”
马修·弗拉申

@Matthew-很奇怪,我不知道Crockford对此感觉如何。他们将如何调和RFC和ECMA之间的差异?
ChaosPandion

3
我只是看了一下,发现他们知道区别。从ECMAScript 5§15.12开始,“ ECMAScript JSON语法的顶级JSONText生成可以包含任何JSONValue,而不是被RFC 4627指定为JSONObject或JSONArray。” 我不知道IETF是否会更改RFC。
马修·弗拉申

@Matthew-谢谢您,我感到非常困惑。该json.org说明没有提到“JSON文本”的更严格的概念可言,和RFC的那种含糊其意义。
mrec

这个答案是关于ECMAScript的,但问题是关于JSON的。尽管它们看起来(故意)相似,但它们是不同的规格
sleske '16


1

在其他评论中看到了一些困惑。根据JSON RFC,“ application / json”媒体类型仅允许在顶层使用JSON文本的对象或数组。但是,对于解析器,可以使用任何JSON值,如ECMAScript规范所示。


ECMAScript解析器可接受任何作为顶级元素的JSON值,但(兼容)JSON解析器则不能接受-重要区别。
sleske '16

这是一个有趣的区别,但是我不明白您在说什么。“(兼容)JSON解析器”的定义是什么?
cdunn2001 '16

1
好的,JSON解析器是JSON语法的解析器。尽管JSON与Javascript相似,但它是一个不同的(简单得多)的语法。请参阅tools.ietf.org/html/rfc7159,它描述了JSON语法。“兼容”仅表示解析器实际上遵循语法(任何体面的解析器都应遵循该语法)。
sleske '16

3
RFC 4627已过时,请不要再遵循它。新的RFC还允许在顶层使用简单的值。
Matthias DieterWallnöfer17年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.