JSON.parse()可以指示有效的JSON格式吗?

时间:2013-09-13 10:46:37

标签: javascript json

很长一段时间我使用try - catch来确保字符串是有效的JSON。今天我发现JSON.parse(1)(一个数字)返回1JSON.parse("123")返回"123",而我期望语法错误如:Expecting '{', '['

即使this answer似乎也无法解决我的问题。

所以,问题是:JSON.parse()可以指示我在那里传递的参数是否具有正确的JSON格式?

如果没有,哪个是另类?

2 个答案:

答案 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 RFCJSON-text = object / array,但EcmaScript JSON Grammar更自由,并认为每个JSONValue都是JSONTextJSON.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);