如何在不使用Try / Catch的状况下检查字符串在JavaScript中是否为有效的JSON字符串

就像是: json

var jsonString = '{ "Id": 1, "Name": "Coke" }';

//should be true
IsJsonString(jsonString);

//should be false
IsJsonString("foo");
IsJsonString("<div>foo</div>")

解决方案不该包含try / catch。 咱们中的一些人打开“打破全部错误”,他们不喜欢调试器打破那些无效的JSON字符串。 函数


#1楼

function get_json(txt)
{  var data

   try     {  data = eval('('+txt+')'); }
   catch(e){  data = false;             }

   return data;
}

若是有错误,则返回false。 this

若是没有错误,则返回json数据 spa


#2楼

我知道我对这个问题迟到了3年,但我感受很高兴。 调试

尽管Gumbo的解决方案效果很好,但它不能处理少数状况下JSON.parse({something that isn't JSON})异常)不会引起异常的状况。 code

我还但愿同时返回解析后的JSON,所以调用代码没必要再次调用JSON.parse(jsonString)对象

这彷佛很好地知足了个人需求: 递归

function tryParseJSON (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;
};

#3楼

这个答案减小了trycatch语句的成本。 字符串

我使用JQuery解析JSON字符串,并使用trycatch语句处理异常,可是对没法解析的字符串抛出异常会减慢个人代码的速度,所以我使用简单的Regex来检查字符串(若是它是可能的JSON字符串)是否不做任何处理经过检查其语法,而后我使用常规方法经过使用JQuery解析字符串: get

if (typeof jsonData == 'string') {
    if (! /^[\[|\{](\s|.*|\w)*[\]|\}]$/.test(jsonData)) {
        return jsonData;
    }
}

try {
    jsonData = $.parseJSON(jsonData);
} catch (e) {

}

我将先前的代码包装在一个递归函数中,以解析嵌套的JSON响应。


#4楼

我使用了一种很是简单的方法来检查字符串是不是有效的JSON。

function testJSON(text){
    if (typeof text!=="string"){
        return false;
    }
    try{
        JSON.parse(text);
        return true;
    }
    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,由于null变量的类型是object。

每次都有效。 :)


#5楼

// vanillaJS
function isJSON(str) {
    try {
        return (JSON.parse(str) && !!str);
    } catch (e) {
        return false;
    }
}

用法: isJSON({})falseisJSON('{}')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({})trueisAO('{}')false

相关文章
相关标签/搜索