我有一个简单的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引擎时,我建议这样做。在这种情况下尤其如此。尽管捕获异常可能有点笨拙,但实际上只是处理外部方法的两种可能返回状态。
我用了这个(有点混合了不同的答案,但不管怎样):
const isJSON = str => {
If (typeof STR === 'string'){
尝试{
JSON.parse (str)
还真
}捕捉(e) {
}
}
返回假
}
[null, undefined, false, true, [], {},
”,“asdf ', '{}', '[]', "{\" abc \”:2}”、“{\“abc \”,\“2 \“}”)
.map(el => {
console.log(' [>${el}<] - ${isJSON(el)} ')
})
console.log ('-----------------')
你可以做一些测试,例如,如果你知道返回的JSON总是被{和}包围,那么你可以测试这些字符,或者其他一些hack方法。或者你可以使用json.org JS库来尝试解析它,并测试它是否成功。
然而,我建议另辟蹊径。如果调用成功,PHP脚本当前返回JSON,如果调用失败,则返回其他内容。为什么不总是返回JSON?
E.g.
成功的电话:
{ "status": "success", "data": [ <your data here> ] }
错误的电话:
{ "status": "error", "error": "Database not found" }
这将使您的客户端JS编写更容易-你所要做的就是检查“status”成员和相应的行为。