我很困惑。引用json.orgJSON构建在两个结构上:
因此,我认为'""'不应该是一个有效的JSON字符串,因为它既不是列表值(即不以'['开头,也不以']'结尾),但JSON.parse不会给予异常并返回空字符串。是否为有效的JSON字符串。
z9zf31ra1#
不,''是不是有效的JSON。JSON.parse('') * 确实 * 抛出错误-只需查看浏览器控制台。下次当您遇到“这是有效的JSON吗?”的问题时,只需通过a JSON validator.运行它,这就是它们存在的原因。
''
JSON.parse('')
7cjasjjr2#
因此,我认为""不应该是有效的JSON字符串它是一个有效的JSON字符串(可能出现在JSON文本中的数据类型)。因为它既不是列表值(即不以“[”开头,也不以“]”结尾)JSON文本(即完整的JSON文档)必须(在最外层)是...(Here因为规格已经修改,我把原来的答案剪了)。JSON文本是一个序列化的值。(引用JSON规范所以""是一个有效的JSON文本,在编写这个答案的原始版本时不是这样的,当最外层的值不是对象或数组时,一些JSON解析器可能会崩溃。最初的答案(现在是错误的)在这里继续:...对象或数组。字符串不是有效的JSON文本。formal specification表示:
""
但回到这里引用的问题:但JSON.parse不会给予异常,而是返回空字符串。你正在使用的JSON解析器过于自由了,不要假设所有的JSON解析器都是如此。例如,如果我运行perl -MJSON -E'say decode_json(q{""})',则会得到:JSON文本在-e第1行必须是一个对象或数组(但找到的是数字、字符串、true、false或null,使用allow_nonref允许这样做)。
perl -MJSON -E'say decode_json(q{""})'
lnvxswe23#
根据最新的JSON RFC 7159,""实际上是有效的JSON,但在一些早期的标准中它不是。引用:JSON文本是一个标记序列,标记集包括六个结构化字符、字符串、数字和三个文字名称。JSON文本是一个序列化的值。请注意,JSON的某些先前规范将JSON文本约束为对象或数组。仅在调用JSON文本的地方生成对象或数组的实现将是可互操作的,因为所有实现都将接受这些对象或数组作为一致的JSON文本。
vql8enpb4#
关于这个问题的其他答案已经过时,并且包含一些不正确的信息。最新的JSON规范是RFC 8259,它废弃了这里引用的以前的RFC。它说:请注意,以前的JSON规范将JSON文本限制为对象或数组。因此,字符串本身作为完整的JSON文本是有效的,它不需要包含在外部对象构造中,RFC的示例部分显示了这一点:下面是三个只包含值的小JSON文本:"你好,世界!"42真字符串的内容当然是无关紧要的,所以空字符串本身是可以接受的。
"
"" // Valid '' // Invalid
4条答案
按热度按时间z9zf31ra1#
不,
''
是不是有效的JSON。JSON.parse('')
* 确实 * 抛出错误-只需查看浏览器控制台。下次当您遇到“这是有效的JSON吗?”的问题时,只需通过a JSON validator.运行它,这就是它们存在的原因。
7cjasjjr2#
因此,我认为
""
不应该是有效的JSON字符串它是一个有效的JSON字符串(可能出现在JSON文本中的数据类型)。
因为它既不是列表值(即不以“[”开头,也不以“]”结尾)
JSON文本(即完整的JSON文档)必须(在最外层)是...
(Here因为规格已经修改,我把原来的答案剪了)。
JSON文本是一个序列化的值。
(引用JSON规范
所以
""
是一个有效的JSON文本,在编写这个答案的原始版本时不是这样的,当最外层的值不是对象或数组时,一些JSON解析器可能会崩溃。最初的答案(现在是错误的)在这里继续:
...对象或数组。字符串不是有效的JSON文本。
formal specification表示:
但回到这里引用的问题:
但JSON.parse不会给予异常,而是返回空字符串。
你正在使用的JSON解析器过于自由了,不要假设所有的JSON解析器都是如此。
例如,如果我运行
perl -MJSON -E'say decode_json(q{""})'
,则会得到:JSON文本在-e第1行必须是一个对象或数组(但找到的是数字、字符串、true、false或null,使用allow_nonref允许这样做)。
lnvxswe23#
根据最新的JSON RFC 7159,
""
实际上是有效的JSON,但在一些早期的标准中它不是。引用:
JSON文本是一个标记序列,标记集包括六个结构化字符、字符串、数字和三个文字名称。
JSON文本是一个序列化的值。请注意,JSON的某些先前规范将JSON文本约束为对象或数组。仅在调用JSON文本的地方生成对象或数组的实现将是可互操作的,因为所有实现都将接受这些对象或数组作为一致的JSON文本。
vql8enpb4#
2023更新
关于这个问题的其他答案已经过时,并且包含一些不正确的信息。最新的JSON规范是RFC 8259,它废弃了这里引用的以前的RFC。它说:
请注意,以前的JSON规范将JSON文本限制为对象或数组。
因此,字符串本身作为完整的JSON文本是有效的,它不需要包含在外部对象构造中,RFC的示例部分显示了这一点:
下面是三个只包含值的小JSON文本:
"你好,世界!"
42
真
字符串的内容当然是无关紧要的,所以空字符串本身是可以接受的。
"
引起来,因此单引号仍然无效:**