我已经仔细阅读了JSON描述http://json.org/,但我不确定我知道这个简单问题的答案。什么字符串是最小可能有效的JSON?

“字符串”是字符串有效的JSON? 42简单的数字是有效的JSON吗? 布尔值是有效的JSON吗? {}空对象是一个有效的JSON? []空数组是有效的JSON吗?


在撰写本文时,JSON仅在RFC4627中进行了描述。它将(在“2”的开头)JSON文本描述为序列化对象或数组。

这意味着只有{}和[]在符合该标准的解析器和stringfier中是有效的、完整的JSON字符串。

然而,ECMA-404的引入改变了这一点,更新的建议可以在这里阅读。我也写了一篇关于这个问题的博客文章。


然而,更让人困惑的是,web浏览器中可用的JSON对象(例如JSON.parse()和JSON.stringify())在ES5中是标准化的,它清楚地定义了可接受的JSON文本,如下所示:

本规范中使用的JSON交换格式与RFC 4627描述的完全相同,但有两个例外: ECMAScript JSON语法的顶级JSONText可以由任何JSONValue组成,而不是像RFC 4627规定的那样被限制为JSONObject或JSONArray。 剪掉

这意味着JSON对象接受所有JSON值(包括字符串、空值和数字),即使JSON对象严格遵守RFC 4627。

请注意,因此您可以通过JSON.stringify(5)在符合规范的浏览器中对数字进行字符串化,这将被另一个遵循RFC4627的解析器拒绝,但该解析器没有上面列出的特定异常。例如,Ruby似乎就是这样一个例子,它只接受对象和数组作为根。另一方面,PHP特别添加了一个例外,即“它也将对标量类型和NULL进行编码和解码”。


根据RFC 4627中的旧定义(已于2014年3月被RFC 7159废止),这些都是有效的“JSON值”,但只有最后两个才构成完整的“JSON文本”:

JSON文本是一个序列化的对象或数组。

根据所使用的解析器,可能会接受单独的“JSON值”。例如(坚持“JSON值”vs“JSON文本”术语):

the JSON.parse() function now standardised in modern browsers accepts any "JSON value" the PHP function json_decode was introduced in version 5.2.0 only accepting a whole "JSON text", but was amended to accept any "JSON value" in version 5.2.1 Python's json.loads accepts any "JSON value" according to examples on this manual page the validator at http://jsonlint.com expects a full "JSON text" the Ruby JSON module will only accept a full "JSON text" (at least according to the comments on this manual page)

这种区别有点像“XML文档”和“XML片段”之间的区别,尽管从技术上讲<foo />是一个格式良好的XML文档(它最好写成<?XML版本="1.0" ?><foo />,但正如注释中指出的,<?XML声明在技术上是可选的)。


是的,是的,是的,是的,是的。它们都是有效的JSON值字面量。

然而,官方RFC 4627规定:

JSON文本是一个序列化的对象或数组。

所以一个完整的“文件”应该包含一个对象或数组作为最外层的结构,当然可以是空的。然而,许多JSON解析器也接受原始值作为输入。


ecma规范可供参考:

http://www.ecma-international.org/ecma-262/5.1/

The parse function parses a JSON text (a JSON-formatted String) and produces an ECMAScript value. The JSON format is a restricted form of ECMAScript literal. JSON objects are realized as ECMAScript objects. JSON arrays are realized as ECMAScript arrays. JSON strings, numbers, booleans, and null are realized as ECMAScript Strings, Numbers, Booleans, and null. JSON uses a more limited set of white space characters than WhiteSpace and allows Unicode code points U+2028 and U+2029 to directly appear in JSONString literals without using an escape sequence. The process of parsing is similar to 11.1.4 and 11.1.5 as constrained by the JSON grammar.

JSON.parse("string"); // SyntaxError: Unexpected token s
JSON.parse(43); // 43
JSON.parse("43"); // 43
JSON.parse(true); // true
JSON.parse("true"); // true
JSON.parse(false);
JSON.parse("false");
JSON.parse("trueee"); // SyntaxError: Unexpected token e
JSON.parse("{}"); // {}
JSON.parse("[]"); // []

JSON代表JavaScript对象表示法。只有{}和[]定义Javascript对象。其他的例子是值字面量。Javascript中有用于处理这些值的对象类型,但表达式“string”是文字值的源代码表示,而不是对象。

请记住JSON不是Javascript。它是一种表示数据的符号。它有一个非常简单和有限的结构。JSON数据使用{},:[]字符进行结构化。只能在该结构中使用文字值。

服务器用对象描述或文字值来响应是完全有效的。所有JSON解析器都应该只处理一个文字值,但只能处理一个值。JSON一次只能表示一个对象。因此,对于一个服务器来说,如果要返回多个值,就必须将其构造为对象或数组。


var x; console.log (JSON.stringify (x));//输出"{}"

所以你的答案是“{}”,它表示一个空对象。


只要按照json.org页面上给出的铁路图表来做就可以了。[]和{}是可能的最小有效JSON对象。所以答案是[]和{}。


Internet上至少有四个文档可以被视为JSON标准。引用的rfc都描述了mime类型application/json。下面是关于顶层值,以及是否允许除对象或数组之外的任何东西位于顶层的说明:

rfc - 4627:没有。

JSON文本是一个令牌序列。令牌集包括6个 结构字符、字符串、数字和三个字面名称。 JSON文本是一个序列化的对象或数组。 JSON-text =对象/数组

请注意,RFC-4627被标记为“信息”,而不是“拟议标准”,它被RFC-7159废止,而RFC-7159又被RFC-8259废止。

rfc - 8259:是的。

JSON文本是一个令牌序列。令牌集包括6个 结构字符、字符串、数字和三个字面名称。 JSON文本是一个序列化的值。请注意,以前的某些 JSON规范将JSON文本约束为对象或对象 数组中。只生成对象或数组的实现 JSON文本调用将是互操作的意义上,所有 实现将接受这些作为符合JSON文本。 JSON-text = ws值

RFC-8259的日期为2017年12月,标记为“INTERNET标准”。

ecma - 262:是的。

JSON句法语法根据JSON词法定义的标记定义有效的JSON文本 语法。语法的目标符号是JSONText。 语法 JSONText: JSONValue JSONValue: JSONNullLiteral JSONBooleanLiteral JSONObject JSONArray JSONString JSONNumber

ecma - 404:是的。

JSON文本是由符合JSON值的Unicode代码点组成的令牌序列 语法。这组令牌包括六个结构令牌、字符串、数字和三个字面名称令牌。