“""”是否为有效的JSON字符串?

ie3xauqp  于 2023-02-26  发布在  其他
关注(0)|答案(4)|浏览(186)

我很困惑。引用json.org
JSON构建在两个结构上:

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

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

z9zf31ra

z9zf31ra1#

不,''不是有效的JSON。JSON.parse('') * 确实 * 抛出错误-只需查看浏览器控制台。
下次当您遇到“这是有效的JSON吗?”的问题时,只需通过a JSON validator.运行它,这就是它们存在的原因。

7cjasjjr

7cjasjjr2#

因此,我认为""不应该是有效的JSON字符串
它是一个有效的JSON字符串(可能出现在JSON文本中的数据类型)。
因为它既不是列表值(即不以“[”开头,也不以“]”结尾)
JSON文本(即完整的JSON文档)必须(在最外层)是...
(Here因为规格已经修改,我把原来的答案剪了)。
JSON文本是一个序列化的值。
(引用JSON规范
所以""是一个有效的JSON文本,在编写这个答案的原始版本时不是这样的,当最外层的值不是对象或数组时,一些JSON解析器可能会崩溃。
最初的答案(现在是错误的)在这里继续:
...对象或数组。字符串不是有效的JSON文本。
formal specification表示:

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

但回到这里引用的问题:
但JSON.parse不会给予异常,而是返回空字符串。
你正在使用的JSON解析器过于自由了,不要假设所有的JSON解析器都是如此。
例如,如果我运行perl -MJSON -E'say decode_json(q{""})',则会得到:
JSON文本在-e第1行必须是一个对象或数组(但找到的是数字、字符串、true、false或null,使用allow_nonref允许这样做)。

lnvxswe2

lnvxswe23#

根据最新的JSON RFC 7159,""实际上是有效的JSON,但在一些早期的标准中它不是。
引用:
JSON文本是一个标记序列,标记集包括六个结构化字符、字符串、数字和三个文字名称。
JSON文本是一个序列化的值。请注意,JSON的某些先前规范将JSON文本约束为对象或数组。仅在调用JSON文本的地方生成对象或数组的实现将是可互操作的,因为所有实现都将接受这些对象或数组作为一致的JSON文本。

vql8enpb

vql8enpb4#

2023更新

关于这个问题的其他答案已经过时,并且包含一些不正确的信息。最新的JSON规范是RFC 8259,它废弃了这里引用的以前的RFC。它说:
请注意,以前的JSON规范将JSON文本限制为对象或数组。
因此,字符串本身作为完整的JSON文本是有效的,它不需要包含在外部对象构造中,RFC的示例部分显示了这一点:
下面是三个只包含值的小JSON文本:
"你好,世界!"
42

字符串的内容当然是无关紧要的,所以空字符串本身是可以接受的。

    • 注意:JSON要求字符串用"引起来,因此单引号仍然无效:**
""    // Valid
''    // Invalid

相关问题