【发布时间】:2011-11-21 05:15:40
【问题描述】:
我在 SO 中看到了很多复杂的问题,是否认为某些复杂的结构是有效的 JSON。
但是光谱的另一端呢?
"12345"
上面的 JSON 是有效的吗?
【问题讨论】:
-
您可能会发现此页面很有用:jsonlint.com
标签: javascript json
我在 SO 中看到了很多复杂的问题,是否认为某些复杂的结构是有效的 JSON。
但是光谱的另一端呢?
"12345"
上面的 JSON 是有效的吗?
【问题讨论】:
标签: javascript json
是的,在大多数情况下。它是表示 JSON 值的有效 JSON 语法。
对此的混淆来自于 Douglas Crockford 的 RFC 4627,它最初在 2006 年定义了 application/json 互联网媒体类型。它说:
JSON 文本是一个序列化的对象或数组。
但是,正如 Crockford 在 2013 年的一篇文章中解释的那样(不幸的是,Google+ 的其余部分已删除,但 archived here):
JSON 只是一个语法,语法包括数字和字符串。 JSON 的使用必须更加严格。 RFC-4627 是一种可能的用途,它从未打算成为 JSON 本身的标准。
示例字符串是一个有效的 JSON 值,但将其用作 application/json HTTP 响应的完整“JSON 文本”正文是不正确的。然而,这已不再正确:RFC-4627 在 2014 年随着 RFC 7159 的发布而被淘汰,它允许您使用任何 JSON 值:
JSON 文本是一个序列化值。请注意,某些先前的 JSON 规范将 JSON 文本限制为对象或数组。
“JSON 本身的标准”也在 2013 年发布,名称为 ECMA-404,并且 JSON 也在 ECMAScript (JavaScript) 规范 ECMA-262 的 5.1 版中定义。这些规范和大多数解析器允许任何 JSON 值作为完整的 JSON 文本,即使它只是一个简单的字符串。
【讨论】:
它是一个有效的 JSON 字符串,但它不是一个 JSON 对象。
【讨论】:
在编写此问题时,这不是有效的 JSON 文本。它应该是一个有效的字符串,可以作为 JSON 文本的一部分出现。
JSON 文本是一个序列化的对象或数组。
...意味着顶层必须是{} 或[]。你不能用绳子直接潜入。
JSON 文本是一个序列化值。请注意,某些先前的 JSON 规范将 JSON 文本限制为对象或数组。
所以现在任何值(包括字符串)都可以是完整的 JSON 文本,"12345" 现在有效。
【讨论】:
截至 2014 年,RFC 7159 淘汰了旧的 JSON RFC,并声明 任何 JSON 值是有效的 JSON 文本和有效的应用程序/json 内容 - 包括字符串。但是,它也指出了与旧 JSON 实现的不兼容问题:
请注意,某些先前的 JSON 规范限制了 JSON 文本作为对象或数组。实现 仅生成需要 JSON 文本的对象或数组 从某种意义上说,所有实现都将是可互操作的 接受这些作为符合标准的 JSON 文本。
【讨论】:
您可以简单地检查 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
【讨论】: