isJsonString('{ "Id": 1, "Name": "Coke" }')

应该是正确的

isJsonString('foo')
isJsonString('<div>foo</div>')

应该为假。

我正在寻找一种不使用try/catch的解决方案,因为我将调试器设置为“在所有错误上中断”,这导致它在无效的JSON字符串上中断。


当前回答

我想我知道你为什么不想这么做。但也许试着去抓!;o)我突然想到:

var json_verify = function(s){ try { JSON.parse(s); return true; } catch (e) { return false; }};

所以你也可以对JSON对象进行脏剪辑,比如:

JSON.verify = function(s){ try { JSON.parse(s); return true; } catch (e) { return false; }};

由于这是尽可能封装的,它可能不会在错误时中断。

其他回答

我想我知道你为什么不想这么做。但也许试着去抓!;o)我突然想到:

var json_verify = function(s){ try { JSON.parse(s); return true; } catch (e) { return false; }};

所以你也可以对JSON对象进行脏剪辑,比如:

JSON.verify = function(s){ try { JSON.parse(s); return true; } catch (e) { return false; }};

由于这是尽可能封装的,它可能不会在错误时中断。

如果您正在处理来自AJAX(或XMLHttpRequest)调用的响应,对我来说有效的方法是检查响应内容类型,并相应地解析或不解析内容。

先评论一下。问题是关于不使用try/catch。 如果你不介意使用它,请阅读下面的答案。 这里我们只是使用regexp检查JSON字符串,它在大多数情况下都可以工作,而不是所有情况。

看看https://github.com/douglascrockford/JSON-js/blob/master/json2.js的450行

有一个regexp检查有效的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

}

编辑:新版本的json2.js进行了比上面更高级的解析,但仍然基于regexp替换(来自@Mrchief的评论)

我使用了一个非常简单的方法来检查字符串是否为有效的JSON。

function testJSON(text){
    if (typeof text!=="string"){
        return false;
    }
    try{
        var json = JSON.parse(text);
        return (typeof json === 'object');
    }
    catch (error){
        return false;
    }
}

返回一个有效的JSON字符串:

var input='["foo","bar",{"foo":"bar"}]';
testJSON(input); // returns true;

返回一个简单的字符串;

var input='This is not a JSON string.';
testJSON(input); // returns false;

返回一个对象:

var input={};
testJSON(input); // returns false;

输入为空的结果:

var input=null;
testJSON(input); // returns false;

最后一个返回false,因为空变量的类型是object。

这种方法每次都有效。:)

使用JSON.parse这样的JSON解析器:

function isJsonString(str) {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return true;
}