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

独自空忆成欢 提交于 2020-02-27 01:06:31

就像是:

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。

如果没有错误,则返回json数据


#2楼

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

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

我还希望同时返回解析后的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解析字符串:

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!