就像是:
var jsonString = '{ "Id": 1, "Name": "Coke" }';
//should be true
IsJsonString(jsonString);
//should be false
IsJsonString("foo");
IsJsonString("<div>foo</div>")
解决方案不应包含 try/catch。我们中的一些人打开“中断所有错误”,他们不喜欢调试器中断那些无效的 JSON 字符串。
就像是:
var jsonString = '{ "Id": 1, "Name": "Coke" }';
//should be true
IsJsonString(jsonString);
//should be false
IsJsonString("foo");
IsJsonString("<div>foo</div>")
解决方案不应包含 try/catch。我们中的一些人打开“中断所有错误”,他们不喜欢调试器中断那些无效的 JSON 字符串。
使用 JSON 解析器,如JSON.parse
:
function IsJsonString(str) {
try {
JSON.parse(str);
} catch (e) {
return false;
}
return true;
}
我知道我问这个问题晚了 3 年,但我想插话说。
虽然 Gumbo 的解决方案效果很好,但它不能处理一些没有引发异常的情况 JSON.parse({something that isn't JSON})
我也更喜欢同时返回解析后的 JSON,这样调用代码就不必JSON.parse(jsonString)
第二次调用了。
这似乎很适合我的需求:
/**
* If you don't care about primitives and only objects then this function
* is for you, otherwise look elsewhere.
* This function will return `false` for any valid json primitive.
* EG, 'true' -> false
* '123' -> false
* 'null' -> false
* '"I'm a string"' -> false
*/
function tryParseJSONObject (jsonString){
try {
var o = JSON.parse(jsonString);
// Handle non-exception-throwing cases:
// Neither JSON.parse(false) or JSON.parse(1234) throw errors, hence the type-checking,
// but... JSON.parse(null) returns null, and typeof null === "object",
// so we must check for that, too. Thankfully, null is falsey, so this suffices:
if (o && typeof o === "object") {
return o;
}
}
catch (e) { }
return false;
};
先评论一下。问题是关于不使用try/catch
.
如果您不介意使用它,请阅读下面的答案。这里我们只是JSON
使用正则表达式检查字符串,它在大多数情况下都有效,而不是所有情况。
看看https://github.com/douglascrockford/JSON-js/blob/master/json2.js 中的第 450 行
有一个检查有效 JSON 的正则表达式,例如:
if (/^[\],:{}\s]*$/.test(text.replace(/\\["\\\/bfnrtu]/g, '@').
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
//the json is ok
}else{
//the json is not ok
}
// vanillaJS
function isJSON(str) {
try {
return (JSON.parse(str) && !!str);
} catch (e) {
return false;
}
}
用法: isJSON({})
将是false
,isJSON('{}')
将是true
。
要检查某个东西是否是一个Array
或Object
(解析的JSON):
// vanillaJS
function isAO(val) {
return val instanceof Array || val instanceof Object ? true : false;
}
// ES2015
var isAO = (val) => val instanceof Array || val instanceof Object ? true : false;
用法: isAO({})
将是true
,isAO('{}')
将是false
。
这是我的工作代码:
function IsJsonString(str) {
try {
var json = JSON.parse(str);
return (typeof json === 'object');
} catch (e) {
return false;
}
}