0

很长一段时间以来,我try - catch一直确信字符串是有效的 JSON。今天我发现JSON.parse(1)(一个数字)返回1JSON.parse("123")返回"123",而我预计会出现语法错误,例如:Expecting '{', '['.

即使这个答案似乎也不能解决我的问题。

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

如果不是,那是什么替代方案?

4

2 回答 2

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");
}
于 2013-09-13T11:03:34.067 回答
2

JSON.parse() 是否可以指示我传递的参数是否具有正确的 JSON 格式?

是的,它就是这样做的。只有“正确”有两种不同的定义。虽然官方 RFCJSON-text = object / arrayEcmaScript JSON 语法更加自由,并且认为每个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);
于 2013-09-13T11:13:16.800 回答