什么是最小有效JSON?

bes*_*bov 157 javascript validation json

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

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

Mat*_*att 140

在撰写本文时,JSON仅在RFC4627中描述.它描述了(在"2"的开头)JSON文本作为序列化对象或数组.

这意味着只有 {}并且[]是符合该标准的解析器和字符串中有效的完整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不是名词,所以"JSON"毫无意义.任何"JSON值"都是"JSON值",但解析器通常期望RFC中定义的"JSON文本". (5认同)
  • 我不好,我会删除我的答案 (2认同)
  • @jmoreno 你能澄清一下你的评论吗?您是说“true”、“false”或“null”单独是有效的 JSON 文本吗?您能否引用一个来源,因为这与这里的大多数其他答案/评论相矛盾? (2认同)
  • @jmoreno:第2节"A JSON文本是一个序列化的对象或数组"的引用当然.反对吗?JSON Lint也不认为非数组或对象是有效的.关于字符串是否是有效的JSON文字,没有争论; 这取决于字符串本身是否有效. (2认同)

Joh*_*ann 39

互联网上至少有四个可以被视为JSON标准的文件.所引用的RFC都描述了mime类型application/json.以下是每个人对顶级值的看法,以及顶部是否允许除对象或数组以外的任何内容:

RFC-4627:不.

JSON文本是一系列标记.标记集包括六个结构字符,字符串,数字和三个文字名称.

JSON文本是序列化对象或数组.

JSON-text =对象/数组

请注意,RFC-4627被标记为"信息性"而不是"建议标准",并且它被RFC-7159废弃,而RFC-7159又被RFC-8259淘汰.

RFC-8259:是的.

JSON文本是一系列标记.标记集包括六个结构字符,字符串,数字和三个文字名称.

JSON文本是序列化值.请注意,某些先前的JSON规范将JSON文本约束为对象或数组.只生成调用JSON文本的对象或数组的实现将是可互操作的,因为所有实现都将接受这些作为符合JSON文本.

JSON-text = ws值ws

RFC-8259的日期为2017年12月,标有"INTERNET STANDARD".

ECMA-262:是的.

JSON语法语法根据JSON词法语法定义的标记定义有效的JSON文本.语法的目标符号是JSONText.

语法JSONText:

JSONValue

JSONValue:

JSONNullLiteral

JSONBooleanLiteral

的JSONObject

JSONArray

JSONString

JSONNumber

ECMA-404:是的.

JSON文本是由符合JSON值语法的Unicode代码点形成的标记序列.该组令牌包括六个结构标记,字符串,数字和三个文字名称标记.


IMS*_*SoP 9

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

JSON文本是序列化对象或数组.

根据所使用的解析器,无论如何都可能接受单独的"JSON值".例如(坚持"JSON值"与"JSON文本"术语):

  • JSON.parse()现在在现代浏览器中标准化的功能接受任何"JSON值"
  • PHP函数json_decode是在5.2.0版本中引入的,只接受整个"JSON文本",但在版本5.2.1中被修改为接受任何"JSON值"
  • json.loads根据本手册页中的示例, Python 接受任何"JSON值"
  • http://jsonlint.com上的验证器需要完整的"JSON文本"
  • Ruby JSON模块只接受完整的"JSON文本"(至少根据本手册页面上的注释)

区别有点像"XML文档"和"XML片段"之间的区别,虽然技术上<foo />是一个格式良好的XML文档(它可以更好地编写<?xml version="1.0" ?><foo />,但在评论中指出,<?xml声明在技术上是可选的).


Emi*_* A. 5

ecma 规范可能可供参考:

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

parse 函数解析 JSON 文本(JSON 格式的字符串)并生成 ECMAScript 值。JSON 格式是 ECMAScript 文字的受限形式。JSON 对象被实现为 ECMAScript 对象。JSON 数组被实现为 ECMAScript 数组。JSON 字符串、数字、布尔值和 null 被实现为 ECMAScript 字符串、数字、布尔值和 null。JSON 使用比 WhiteSpace 更有限的空白字符集,并允许 Unicode 代码点 U+2028 和 U+2029 直接出现在 JSONString 文本中,而无需使用转义序列。受JSON语法约束,解析过程与11.1.4和11.1.5类似。

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("[]"); // []
Run Code Online (Sandbox Code Playgroud)

  • 虽然这是一个有用的参考,但它是特定 JSON 解析器(ECMAScript 标准中定义的解析器)的规范,而不是格式本身。http://json.org/ 明确指出 JSON 是“完全独立于语言的”,因此不存在正确的解析器。 (6认同)
  • 你应该做 `JSON.parse("\"string\"");` (6认同)

Rea*_*lar 5

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

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

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