我已经仔细阅读了JSON描述http://json.org/,但我不确定我知道这个简单问题的答案。什么字符串是最小可能有效的JSON?
“字符串”是字符串有效的JSON? 42简单的数字是有效的JSON吗? 布尔值是有效的JSON吗? {}空对象是一个有效的JSON? []空数组是有效的JSON吗?
我已经仔细阅读了JSON描述http://json.org/,但我不确定我知道这个简单问题的答案。什么字符串是最小可能有效的JSON?
“字符串”是字符串有效的JSON? 42简单的数字是有效的JSON吗? 布尔值是有效的JSON吗? {}空对象是一个有效的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仅在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进行编码和解码”。
var x; console.log (JSON.stringify (x));//输出"{}"
所以你的答案是“{}”,它表示一个空对象。
根据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声明在技术上是可选的)。
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.org页面上给出的铁路图表来做就可以了。[]和{}是可能的最小有效JSON对象。所以答案是[]和{}。