1

我很困惑。引用 json.org

JSON 建立在两种结构之上:

  • 名称/值对的集合。在各种语言中,这被实现为对象、记录、结构、字典、哈希表、键控列表或关联数组。
  • 值的有序列表。在大多数语言中,这被实现为数组、向量、列表或序列。

所以,我不认为 '""' 应该是一个有效的 JSON 字符串,因为它既不是一个列表值(即不以 '[' 开头并以 ']' 结尾)但 JSON.parse 不给出异常并返回空字符串。

它是一个有效的 JSON 字符串吗?

4

3 回答 3

4

不,''不是有效的JSON。JSON.parse('') 确实会引发错误 - 只需查看浏览器控制台即可。

下次你有一个“这是有效的 JSON 吗?” 问题,只需通过JSON 验证器运行它。这就是它们存在的原因。

于 2013-03-10T17:58:15.053 回答
4

所以,我不认为""应该是一个有效的 JSON 字符串

它是一个有效的 JSON 字符串(这是一种可能出现在 JSON 文本中的数据类型)。

因为它既不是列表值(即不以'['开头并以']'结尾)

JSON文本(即完整的 JSON 文档)必须(在最外层)是对象或数组。字符串不是有效的 JSON 文本。

正式规范说:

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

但回到这里引用问题:

但 JSON.parse 不给出异常并返回空字符串。

您使用的 JSON 解析器过于自由。不要假设所有的 JSON 解析器都会。

例如,如果我跑步,perl -MJSON -E'say decode_json(q{""})'我会得到:

JSON 文本必须是 -e 第 1 行的对象或数组(但找到数字、字符串、true、false 或 null,使用 allow_nonref 允许这样做)。

于 2013-03-10T18:05:18.527 回答
2

遵循最新的 JSON RFC 7159""实际上是有效的 JSON。但在一些早期的标准中并非如此。

引用:

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

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

于 2017-07-24T07:18:52.723 回答