如何在不使用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式来检查一个JSON
string,它在大多数情况下都可以工作,而不是所有的情况。
在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({})
将为false
, isJSON('{}')
将为true
。
检查是否是Array
或Object
( parsing的 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({})
将为true
, isAO('{}')
将为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 }