我已经仔细阅读了JSON描述http://json.org/,但我不确定我知道这个简单问题的答案。什么字符串是最小可能有效的JSON?
“字符串”是字符串有效的JSON? 42简单的数字是有效的JSON吗? 布尔值是有效的JSON吗? {}空对象是一个有效的JSON? []空数组是有效的JSON吗?
我已经仔细阅读了JSON描述http://json.org/,但我不确定我知道这个简单问题的答案。什么字符串是最小可能有效的JSON?
“字符串”是字符串有效的JSON? 42简单的数字是有效的JSON吗? 布尔值是有效的JSON吗? {}空对象是一个有效的JSON? []空数组是有效的JSON吗?
当前回答
var x; console.log (JSON.stringify (x));//输出"{}"
所以你的答案是“{}”,它表示一个空对象。
其他回答
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代码点组成的令牌序列 语法。这组令牌包括六个结构令牌、字符串、数字和三个字面名称令牌。
在撰写本文时,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进行编码和解码”。
JSON代表JavaScript对象表示法。只有{}和[]定义Javascript对象。其他的例子是值字面量。Javascript中有用于处理这些值的对象类型,但表达式“string”是文字值的源代码表示,而不是对象。
请记住JSON不是Javascript。它是一种表示数据的符号。它有一个非常简单和有限的结构。JSON数据使用{},:[]字符进行结构化。只能在该结构中使用文字值。
服务器用对象描述或文字值来响应是完全有效的。所有JSON解析器都应该只处理一个文字值,但只能处理一个值。JSON一次只能表示一个对象。因此,对于一个服务器来说,如果要返回多个值,就必须将其构造为对象或数组。
是的,是的,是的,是的,是的。它们都是有效的JSON值字面量。
然而,官方RFC 4627规定:
JSON文本是一个序列化的对象或数组。
所以一个完整的“文件”应该包含一个对象或数组作为最外层的结构,当然可以是空的。然而,许多JSON解析器也接受原始值作为输入。
var x; console.log (JSON.stringify (x));//输出"{}"
所以你的答案是“{}”,它表示一个空对象。