如何在不使用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

相關文章
相關標籤/搜索