为什么使用空字符串时JSON.parse会失败?

122

为什么会:

JSON.parse('');

产生错误?

Uncaught SyntaxError: Unexpected end of input

如果它只返回null,那不是更合乎逻辑吗?

编辑:这不是链接问题的重复。虽然最小有效JSON的主题与此问题有关,但它没有涉及到“为什么”。


是的,看起来parse函数的设计存在一个bug。你可以用try catch将其包装起来...但那样很丑 :) - vsync
3
当传入无效的 JSON,比如空字符串时,它会产生错误。为了避免这样的错误,实际上经常会创建一个被包含在 try/catch 中的别名。 - adeneo
2
一个空字符串不是有效的 JSON,因此它会失败。不要认为它值得更多的分析 :) - Claudio Redi
1
请在此处阅读JSON定义:http://en.wikipedia.org/wiki/JSON 如果您需要检查JSON,可以使用任何JSON验证器,例如http://jsonlint.com/。如果您需要空的JSON,则必须使用{}。 - Hayk Mantashyan
8
许多人已经提到,一个空字符串不是一个有效的JSON字符串。说实话,我认为这是规范的一个缺陷,因为返回null将是微不足道的。需要用户检查空字符串或null,或将JSON.parse包装在try ... catch内部是不必要的。问题需要被问到也表明它并不直观。无论如何,你可以使用:JSON.parse(data || '{}')将一个空字符串强制转换为安全的内容。 - Manngo
显示剩余5条评论
5个回答

192

由于空字符串不是有效的JSON,所以JSON.parse('')返回null是不正确的,因为"null"是有效的JSON。例如:

JSON.parse("null");

返回null。将无效的 JSON 解析为 null 是错误的。

虽然空字符串不是有效的 JSON,但两个引号却是有效的 JSON。这是一个重要的区别。

也就是说,包含两个引号的字符串与空字符串不是同一件事。

JSON.parse('""');

会被正确解析,(返回一个空字符串)。但是

JSON.parse('');

不会。

有效的最小JSON字符串为

空对象'{}'

空数组'[]'

空字符串'""'

数字,例如'123.4'

布尔值true'true'

布尔值false'false'

null值'null'


2
JSON.parse('""') 不起作用。我得到了以下错误: JSON::ParserError: 757: '""'处有意外的标记。 - Sam
我刚在Chrome控制台中运行了JSON.parse('""');,并且它按预期工作。 - bhspencer
4
这是因为所有合法的JSON必须是字符串,而null不是一个字符串。 - bhspencer
1
@StephenR 我想这取决于你使用的规范。Douglas Crockford 开始的规范在这里 http://json.org,它允许此答案中列出的基本类型。 - bhspencer
5
@bhspencer 哼,你会相信谁?是我还是那个发明了这个标准的陌生人在互联网上? ;-) - Stephen R
显示剩余4条评论

20

使用 try-catch 来避免此问题:

var result = null;
try {
  // if jQuery
  result = $.parseJSON(JSONstring);
  // if plain js
  result = JSON.parse(JSONstring);
}
catch(e) {
  // forget about it :)
}

1

JSON.parse需要在字符串内部提供有效的符号,可以是对象{}、数组[]、字符串""或数字类型(int、float、doubles)。

如果有可能解析的内容是空字符串,则开发人员应该检查它。

如果将其构建到函数中,则会增加额外的循环,因为内置函数应该具有极高的性能,因此不将它们编程为竞争情况是有意义的。


1
这不是正确的。尝试解析一个包含两个引号的字符串:JSON.parse('“”'); - bhspencer
2
JSON不是一种标记语言,更准确地说,JSON.parse期望一个符合规范的字符串。 - bhspencer
2
JSON并不支持int原始类型。它被称为“number”,支持实际值而不仅仅是整数。 - bhspencer
JSON.parse接受数字,例如JSON.parse(123.45) -> 123.45,在Firefox中至少是如此。 - fantom

-2

-2

一个有效的 JSON 字符串至少需要一个 "{}"。请参见 http://json.org/ 了解更多信息。


5
这不正确。只包含两个引号的字符串是有效的 JSON。 - bhspencer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接