我已经仔细阅读了JSON描述http://json.org/,但我不确定我知道这个简单问题的答案。什么字符串是最小可能有效的JSON?
“字符串”是字符串有效的JSON? 42简单的数字是有效的JSON吗? 布尔值是有效的JSON吗? {}空对象是一个有效的JSON? []空数组是有效的JSON吗?
我已经仔细阅读了JSON描述http://json.org/,但我不确定我知道这个简单问题的答案。什么字符串是最小可能有效的JSON?
“字符串”是字符串有效的JSON? 42简单的数字是有效的JSON吗? 布尔值是有效的JSON吗? {}空对象是一个有效的JSON? []空数组是有效的JSON吗?
当前回答
是的,是的,是的,是的,是的。它们都是有效的JSON值字面量。
然而,官方RFC 4627规定:
JSON文本是一个序列化的对象或数组。
所以一个完整的“文件”应该包含一个对象或数组作为最外层的结构,当然可以是空的。然而,许多JSON解析器也接受原始值作为输入。
其他回答
JSON代表JavaScript对象表示法。只有{}和[]定义Javascript对象。其他的例子是值字面量。Javascript中有用于处理这些值的对象类型,但表达式“string”是文字值的源代码表示,而不是对象。
请记住JSON不是Javascript。它是一种表示数据的符号。它有一个非常简单和有限的结构。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.org页面上给出的铁路图表来做就可以了。[]和{}是可能的最小有效JSON对象。所以答案是[]和{}。
是的,是的,是的,是的,是的。它们都是有效的JSON值字面量。
然而,官方RFC 4627规定:
JSON文本是一个序列化的对象或数组。
所以一个完整的“文件”应该包含一个对象或数组作为最外层的结构,当然可以是空的。然而,许多JSON解析器也接受原始值作为输入。
根据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声明在技术上是可选的)。