isJsonString('{ "Id": 1, "Name": "Coke" }')
应该是正确的
isJsonString('foo')
isJsonString('<div>foo</div>')
应该为假。
我正在寻找一种不使用try/catch的解决方案,因为我将调试器设置为“在所有错误上中断”,这导致它在无效的JSON字符串上中断。
isJsonString('{ "Id": 1, "Name": "Coke" }')
应该是正确的
isJsonString('foo')
isJsonString('<div>foo</div>')
应该为假。
我正在寻找一种不使用try/catch的解决方案,因为我将调试器设置为“在所有错误上中断”,这导致它在无效的JSON字符串上中断。
当前回答
我知道我问这个问题已经晚了3年,但我还是想插话。
虽然Gumbo的解决方案工作得很好,但它不能处理一些没有引发JSON异常的情况。解析({非JSON})
我也更喜欢同时返回解析后的JSON,这样调用代码就不必再次调用JSON.parse(jsonString)。
这似乎很适合我的需求:
/**
* If you don't care about primitives and only objects then this function
* is for you, otherwise look elsewhere.
* This function will return `false` for any valid json primitive.
* EG, 'true' -> false
* '123' -> false
* 'null' -> false
* '"I'm a string"' -> false
*/
function tryParseJSONObject (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;
};
其他回答
先评论一下。问题是关于不使用try/catch。 如果你不介意使用它,请阅读下面的答案。 这里我们只是使用regexp检查JSON字符串,它在大多数情况下都可以工作,而不是所有情况。
看看https://github.com/douglascrockford/JSON-js/blob/master/json2.js的450行
有一个regexp检查有效的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进行了比上面更高级的解析,但仍然基于regexp替换(来自@Mrchief的评论)
isValidJsonString - check for valid json string JSON data types - string, number, object (JSON object), array, boolean, null (https://www.json.org/json-en.html) falsy values in javascript - false, 0, -0, 0n, ", null, undefined, NaN - (https://developer.mozilla.org/en-US/docs/Glossary/Falsy) JSON.parse works well for number , boolean, null and valid json String won't raise any error. please refer example below JSON.parse(2) // 2 JSON.parse(null) // null JSON.parse(true) // true JSON.parse('{"name":"jhamman"}') // {name: "jhamman"} JSON.parse('[1,2,3]') // [1, 2, 3] break when you parse undefined , object, array etc it gave Uncaught SyntaxError: Unexpected end of JSON input . please refer example below JSON.parse({}) JSON.parse([]) JSON.parse(undefined) JSON.parse("jack")
function isValidJsonString(jsonString){
if(!(jsonString && typeof jsonString === "string")){
return false;
}
try{
JSON.parse(jsonString);
return true;
}catch(error){
return false;
}
}
你当然可以用try catch来检查它是否是一个有效的JSON
在Firfox Quantom 60
在函数中使用函数来测试JSON,并使用该输出来验证字符串。听一个例子。
function myfunction(text){
//function for validating json string
function testJSON(text){
try{
if (typeof text!=="string"){
return false;
}else{
JSON.parse(text);
return true;
}
}
catch (error){
return false;
}
}
//content of your real function
if(testJSON(text)){
console.log("json");
}else{
console.log("not json");
}
}
//use it as a normal function
myfunction('{"name":"kasun","age":10}')
function get_json(txt)
{ var data
try { data = eval('('+txt+')'); }
catch(e){ data = false; }
return data;
}
如果有错误,返回false。
如果没有错误,则返回json数据
我来得太晚了。这就是我最后做的事。 使用快速的regex预检查可以大大提高性能
if(/^\s*(\{|\[)/.test(str)){
try{
JSON.parse(str)
// do something here, or return obj/true
}catch(e){
// do nothing or return false
}
}
正则表达式将检查字符串是否以[或{开头。 这将消除大多数错误情况(不是全部)。 下面是一个快速的性能测试https://jsbench.me/awl6fgn8jb/1
最坏的情况下,这可能比直接使用try慢10-15%,最坏的情况意味着所有字符串都是有效的json字符串。
最好的情况下这比纯try快99%,最好的情况下意味着所有字符串都是无效的json。