这个简单的字符串被认为是有效的 JSON 吗?

IT技术 javascript json
2021-02-06 06:39:07

我在 SO 中看到了很多复杂的问题,无论某些复杂的结构是否被认为是有效的 JSON。

但是光谱另一端的东西呢?

"12345"

以上是有效的 JSON 吗?

5个回答

是的,在大多数情况下。它是表示 JSON 值的有效 JSON 语法。

对此的困惑来自 Douglas Crockford 的RFC 4627,它最初application/json在 2006 年定义了互联网媒体类型。它说:

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

然而,正如克罗克福德在 2013 年的一篇帖子中所解释的那样(不幸的是被 Google+ 的其余部分删除,但在此处存档):

JSON 只是一种语法,语法包括数字和字符串。JSON 的使用必须更加严格。RFC-4627 是一种可能的用途,并且从未打算成为 JSON 本身的标准。

示例字符串是一个有效的 JSON 值,但将其用作application/jsonHTTP 响应的完整“JSON 文本”正文是不正确的然而,这不再是事实:RFC-4627 在 2014 年随着RFC 7159的发布而过时,它允许您使用任何 JSON 值:

JSON 文本是一个序列化的值。请注意,某些先前的 JSON 规范将 JSON 文本限制为对象或数组。

“JSON 本身的标准”也在 2013 年发布,作为ECMA-404,并且 JSON 也在 ECMAScript (JavaScript) 规范ECMA-262 的5.1 版中定义这些规范和大多数解析器允许任何 JSON 值作为完整的 JSON 文本,即使它只是一个简单的字符串。

截至 2014 年,RFC 7159 废弃了旧的 JSON RFC,并声明任何JSON 值都是有效的 JSON 文本和有效的应用程序/json 内容——包括字符串。但是,它还指出了与旧 JSON 实现的不兼容问题:

请注意,某些先前的 JSON 规范将 JSON 文本限制为对象或数组。仅生成需要 JSON 文本的对象或数组的实现将是可互操作的,因为所有实现都将接受这些作为一致的 JSON 文本。

它是一个有效的 JSON 字符串,但它不是一个 JSON 对象。

http://www.json.org/

在编写此问题时,这不是有效的 JSON 文本。它应该是一个有效的字符串,可以作为 JSON 文本的一部分出现。

最初的规范说:

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

...意味着顶级必须是{}or []你不能用绳子直接潜入水中。

最新的规范说:

JSON 文本是一个序列化的值。请注意,某些先前的 JSON 规范将 JSON 文本限制为对象或数组。

所以现在任何值,包括字符串,都可以是完整的 JSON 文本并且"12345"现在有效。

您可以简单地检查 JSON.parse 可以处理的内容:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#examples

这是所有有效的 JSON:

JSON.parse('{}');              // {}
JSON.parse('true');            // true
JSON.parse('"foo"');           // "foo"
JSON.parse('[1, 5, "false"]'); // [1, 5, "false"]
JSON.parse('null');            // null