很长一段时间以来,我try - catch
一直确信字符串是有效的 JSON。今天我发现JSON.parse(1)
(一个数字)返回1
并JSON.parse("123")
返回"123"
,而我预计会出现语法错误,例如:Expecting '{', '['
.
即使这个答案似乎也不能解决我的问题。
所以,问题是: JSON.parse() 是否可以指示我传递的参数是否具有正确的 JSON 格式?
如果不是,那是什么替代方案?
很长一段时间以来,我try - catch
一直确信字符串是有效的 JSON。今天我发现JSON.parse(1)
(一个数字)返回1
并JSON.parse("123")
返回"123"
,而我预计会出现语法错误,例如:Expecting '{', '['
.
即使这个答案似乎也不能解决我的问题。
所以,问题是: JSON.parse() 是否可以指示我传递的参数是否具有正确的 JSON 格式?
如果不是,那是什么替代方案?
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");
}
JSON.parse() 是否可以指示我传递的参数是否具有正确的 JSON 格式?
是的,它就是这样做的。只有“正确”有两种不同的定义。虽然官方 RFC说JSON-text = object / array
,EcmaScript 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);