如何在不使用Try / Catch的情况下检查string是否是JavaScript中的有效JSONstring

就像是:

var jsonString = '{ "Id": 1, "Name": "Coke" }'; //should be true IsJsonString(jsonString); //should be false IsJsonString("foo"); IsJsonString("<div>foo</div>") 

解决scheme不应该包含try / catch。 我们中的一些人打开“打破所有错误”,他们不喜欢debugging器打破这些无效的JSONstring。

先评论一下。 问题是关于不使用try/catch
如果您不介意使用它,请阅读下面的答案。 这里我们只用一个正则expression式来检查一个JSONstring,它在大多数情况下都可以工作,而不是所有的情况。

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

有一个正则expression式检查有效的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的新版本使得比上述更先进的parsing,但仍然基于正则expression式replace(从@Mrchief的评论)

使用JSONparsing器,如JSON.parse

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

我知道我对这个问题迟了3年,但是我感觉好像在打瞌睡。

虽然Gumbo的解决scheme效果很好,但是它并没有处理一些JSON.parse({something that isn't JSON})例外情况。

我也更喜欢同时返回parsing的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; }; 
 // vanillaJS function isJSON(str) { try { return (JSON.parse(str) && !!str); } catch (e) { return false; } } 

用法: isJSON({})将为falseisJSON('{}')将为true

检查是否是ArrayObjectparsing的 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

在原型js我们有方法isJSON。 试试看

http://api.prototypejs.org/language/string/prototype/isjson/

甚至http://www.prototypejs.org/learn/json

 "something".isJSON(); // -> false "\"something\"".isJSON(); // -> true "{ foo: 42 }".isJSON(); // -> false "{ \"foo\": 42 }".isJSON(); 

你可以使用javascript eval()函数来validation它是否有效。

例如

 var jsonString = '{ "Id": 1, "Name": "Coke" }'; var json; try { json = eval(jsonString); } catch (exception) { //It's advisable to always catch an exception since eval() is a javascript executor... json = null; } if (json) { //this is json } 

或者,您可以使用json.org中的 JSON.parse函数:

 try { json = JSON.parse(jsonString); } catch (exception) { json = null; } if (json) { //this is json } 

希望这可以帮助。

警告eval()危险的,如果有人添加恶意的JS代码,因为它会执行它。 确保JSONstring是值得信赖的 ,也就是说,您从可信任的来源得到它。

编辑对于我的第一个解决scheme,build议这样做。

  try { json = eval("{" + jsonString + "}"); } catch (exception) { //It's advisable to always catch an exception since eval() is a javascript executor... json = null; } 

为了保证 json-ness。 如果jsonString不是纯JSON,则eval将抛出exception。

我用一个非常简单的方法来检查一个string如何是一个有效的JSON或不。

 function testJSON(text){ try{ JSON.parse(text); return true; } catch (error){ return false; } } 

带有有效JSONstring的结果:

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

用简单的string结果;

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

这每次都有效。 🙂

从这里 Prototype框架的String.isJSON定义

 /** * String#isJSON() -> Boolean * * Check if the string is valid JSON by the use of regular expressions. * This security method is called internally. * * ##### Examples * * "something".isJSON(); * // -> false * "\"something\"".isJSON(); * // -> true * "{ foo: 42 }".isJSON(); * // -> false * "{ \"foo\": 42 }".isJSON(); * // -> true **/ function isJSON() { var str = this; if (str.blank()) return false; str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@'); str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'); str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, ''); return (/^[\],:{}\s]*$/).test(str); } 

所以这是可以用来传递一个string对象的版本

 function isJSON(str) { if ( /^\s*$/.test(str) ) return false; str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@'); str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'); str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, ''); return (/^[\],:{}\s]*$/).test(str); } 
 function isJSON(str) { if ( /^\s*$/.test(str) ) return false; str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@'); str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'); str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, ''); return (/^[\],:{}\s]*$/).test(str); } console.log ("this is a json", isJSON( "{ \"key\" : 1, \"key2@e\" : \"val\"}" ) ) console.log("this is not a json", isJSON( "{ \"key\" : 1, \"key2@e\" : pippo }" ) ) 

这个答案可以降低trycatch语句的成本。

我使用JQuery来parsingJSONstring,我使用trycatch语句来处理exception,但抛出不可parsingstring的exception减慢了我的代码,所以我用简单的正则expression式来检查string是否是可能的JSONstring,通过检查它的语法,然后我通过使用JQueryparsingstring来使用常规方法:

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

我用recursion函数包装了以前的代码来parsing嵌套的JSON响应。

也许它会有用:

  function parseJson(code) { try { return JSON.parse(code); } catch (e) { return code; } } function parseJsonJQ(code) { try { return $.parseJSON(code); } catch (e) { return code; } } var str = "{\"a\":1,\"b\":2,\"c\":3,\"d\":4,\"e\":5}"; alert(typeof parseJson(str)); alert(typeof parseJsonJQ(str)); var str_b = "c"; alert(typeof parseJson(str_b)); alert(typeof parseJsonJQ(str_b)); 

输出:

IE7: string ,对象,string,string

CHROME:对象,对象,string,string

我想我知道你为什么要避免这种情况。 但是,也许尝试和赶上!==尝试和赶上。 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; }}; 

因为这样尽可能封堵,所以不会因错误而中断。

 function get_json(txt) { var data try { data = eval('('+txt+')'); } catch(e){ data = false; } return data; } 

如果有错误,则返回false。

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

 var jsonstring='[{"ConnectionString":"aaaaaa","Server":"ssssss"}]'; if(((x)=>{try{JSON.parse(x);return true;}catch(e){return false}})(jsonstring)){ document.write("valide json") }else{ document.write("invalide json") } 

我这样说:

 if (!typeof arg == 'object') { //Not JSon } else { //Json }