为什么会:
JSON.parse('');
产生错误?
Uncaught SyntaxError: Unexpected end of input
如果它只返回null
,那不是更合乎逻辑吗?
编辑:这不是链接问题的重复。虽然最小有效JSON的主题与此问题有关,但它没有涉及到“为什么”。
为什么会:
JSON.parse('');
产生错误?
Uncaught SyntaxError: Unexpected end of input
如果它只返回null
,那不是更合乎逻辑吗?
编辑:这不是链接问题的重复。虽然最小有效JSON的主题与此问题有关,但它没有涉及到“为什么”。
由于空字符串不是有效的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'
JSON.parse('""');
,并且它按预期工作。 - bhspencer使用 try-catch 来避免此问题:
var result = null;
try {
// if jQuery
result = $.parseJSON(JSONstring);
// if plain js
result = JSON.parse(JSONstring);
}
catch(e) {
// forget about it :)
}
JSON.parse
需要在字符串内部提供有效的符号,可以是对象{}
、数组[]
、字符串""
或数字类型(int、float、doubles)。
如果有可能解析的内容是空字符串,则开发人员应该检查它。
如果将其构建到函数中,则会增加额外的循环,因为内置函数应该具有极高的性能,因此不将它们编程为竞争情况是有意义的。
JSON.parse(123.45)
-> 123.45,在Firefox中至少是如此。 - fantom因为 '' 不是有效的 Javascript/JSON 对象。一个空对象应该是 '{}'。
参考链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse
一个有效的 JSON 字符串至少需要一个 "{}"。请参见 http://json.org/ 了解更多信息。
parse
函数的设计存在一个bug。你可以用try catch
将其包装起来...但那样很丑 :) - vsyncJSON.parse
包装在try ... catch
内部是不必要的。问题需要被问到也表明它并不直观。无论如何,你可以使用:JSON.parse(data || '{}')
将一个空字符串强制转换为安全的内容。 - Manngo