我有一个简单的AJAX调用,服务器将返回一个带有有用数据的JSON字符串或一个由PHP函数mysql_error()产生的错误消息字符串。如何测试该数据是JSON字符串还是错误消息。
使用一个名为isJSON的函数会很好,就像你可以使用instanceof函数来测试某个东西是否是数组一样。
这就是我想要的:
if (isJSON(data)){
//do some data stuff
}else{
//report the error
alert(data);
}
警告:对于依赖JSON的方法。parse -数组和引号括起来的字符串也会被传递。console.log (JSON.parse ([3]), JSON.parse (" \ uD800 ")))
为了避免所有非对象JSON原语(boolean, null, array, number, string),我建议使用以下方法:
/* Validate a possible object ie. o = { "a": 2 } */
const isJSONObject = (o) =>
!!o && (typeof o === 'object') && !Array.isArray(o) &&
(() => { try { return Boolean(JSON.stringify(o)); } catch { return false } })()
/* Validate a possible JSON object represented as string ie. s = '{ "a": 3 }' */
function isJSONObjectString(s) {
try {
const o = JSON.parse(s);
return !!o && (typeof o === 'object') && !Array.isArray(o)
} catch {
return false
}
}
代码的解释
!!o -非假(不包括null,它注册为'object'类型)
(typeof o === 'object') -不包括布尔值,数字和字符串
Array.isArray(o) -排除数组(注册为'object'类型的数组)
试一试……JSON。stringify / JSON。parse -请求JavaScript引擎判断是否有效的JSON
为什么不使用hasJsonStructure()答案?
依赖toString()不是一个好主意。这是因为不同的JavaScript引擎可能返回不同的字符串表示形式。一般来说,依赖于此的方法在不同的环境中可能会失败,或者在引擎更改字符串结果后可能会失败
为什么捕获异常不是破解?
有人提出,通过捕获异常来确定某个东西的有效性从来都不是正确的方法。这通常是一个好建议,但也不总是这样。在这种情况下,异常捕获可能是最好的方法,因为它依赖于JavaScript引擎验证JSON数据的实现。
依赖JS引擎提供了以下优势:
更彻底,随着JSON规范的变化不断更新
可能运行得更快(因为它是较低级别的代码)
当有机会依赖JavaScript引擎时,我建议这样做。在这种情况下尤其如此。尽管捕获异常可能有点笨拙,但实际上只是处理外部方法的两种可能返回状态。