很长一段时间我使用try - catch
来确保字符串是有效的JSON。今天我发现JSON.parse(1)
(一个数字)返回1
而JSON.parse("123")
返回"123"
,而我期望语法错误如:Expecting '{', '['
。
即使this answer似乎也无法解决我的问题。
所以,问题是:JSON.parse()可以指示我在那里传递的参数是否具有正确的JSON格式?
如果没有,哪个是另类?
答案 0 :(得分:2)
ECMA-262 15.12.1.2 - JSON Syntactic Grammar 中给出的语法:
JSONText :
JSONValue
JSONValue :
JSONNullLiteral
JSONBooleanLiteral
JSONObject
JSONArray
JSONString
JSONNumber
因此普通原始类型值实际上是有效的JSON。您期望只有数组和复杂对象是有效的JSON是错误的。
JSON.parse(1)
将被强制转换为字符串,因此它等同于JSON.parse("1")
。 1
是有效的JSONValue
,因此是有效的JSONText
,导致解析器再次返回1
。与JSON.parse("123")
相同。
ECMA-262语法似乎与RFC 4627中给出的语法不同,但希望浏览器遵循ECMA而不是RFC。
PS:你仍然可以通过以下方式进一步验证:
var v = JSON.parse(jsonString);
if (v !== new Object(v)) { // Also: works when v = null
throw new Error("Not an Object/Array");
}
答案 1 :(得分:2)
JSON.parse()可以指示我在那里传递的参数是否具有正确的JSON格式?
是的,这就是它的作用。只有“正确”有两种不同的定义。虽然official RFC说JSON-text = object / array
,但EcmaScript JSON Grammar更自由,并认为每个JSONValue
都是JSONText
。 JSON.parse
确实按预期工作。
如果要将接受的值限制为对象和数组表示法,只需使用
var result = JSON.parse(string);
if (result !== Object(result)) // typeof result != 'object' || result == null
throw new Error("JSON.parse: Object or Array literal expected, got: "+typeof result);